Variable für aktuellen Absatz? Makro für flexible Texte?

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


RalfR
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 13. Okt 2010, 19:00

Variable für aktuellen Absatz? Makro für flexible Texte?

Beitrag von RalfR »

Hallo,

ich habe mal ein erstes Makro geschrieben, das ich
gern nach und nach erweitern möchte.
Im Moment kann es nur eins: einen Namen abwechselnd
durch das zugehörige (wenn auch nicht immer vollständig
passende Personalpronomen "er" zu ersetzen:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[english,german,ngerman]{babel}
\selectlanguage{german}

\RequirePackage[left=3.0cm,top=2.5cm,right=2cm,bottom=3.0cm]{geometry}

\usepackage[utf8]{inputenc}
\usepackage{xspace}

\newcounter{namecounter}
\setcounter{namecounter}{1}

\newcommand{\name}{
\ifodd\value{namecounter}
Herr Müller\xspace
\else
Er\xspace
\fi
\stepcounter{namecounter}
}

\begin{document}
\name ist Reporter. \name kommt in der ganzen Welt herum, um Recherchen und Interviews zu machen. 
\name hat Journalistik studiert.  Wenn \name nochmal zu entscheiden hätte, würde er es wieder genauso machen. \name mag seine Arbeit sehr. 

Jetzt wechseln wir das Thema und sprechen kurz über etwas ganz Anderes: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet

Aber wieder zurück zum Journalismus: \\
{\Huge\name} ist derzeit in Amerika, um dort Kongreßabgeordnete zu interviewen.

\end{document}


Schön wären im nächsten Schritt folgende weitere Features:

(1) wenn "bei" er automatisch erkannt würde, ob es sich um
einen Satzanfang handelt (es also groß oder klein geschrieben
werden müßte). Gibt es dafür ein Package ähnlich wie xspace?

(2) Wenn bei {\Huge\name} nicht "er" sondern wieder der volle Name (wg. "längerer Pause") verwendet würde. Die Frage also: wie kann
ich "längere Pause" in LaTeX abfragen? Gibt es eine Variable,
in der die aktuelle Position im Dokument codiert ist.
Oder kann ich abfragen, in welchem Absatz ich mich befinde
(könnte ich also ein Kriterium aufnehmen:
pro Absatz alternierende Verwendung von "Herr Müller" und "er",
bei neuem Absatz aber reset der counter-Variable, so dass
wieder mit "Herr Müller" begonnen wird?


Danke für Tips jeder Art.


Übrigens. ich finde es allgemein sehr schwierig,
Infos/Tutorials zu Programmierung in LaTeX zu finden.

Gibt es irgendwo eine Befehlsreferenz/ein Tutorial/eine
strukturierte Einführung?

Danke,

Ralf

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Rückschau gibt es in TeX nicht. Deshalb ist es auch nicht möglich nachträglich heraus zu finden, dass man am Satzanfang ist. Ebenso zählt TeX normalerweise keine Absätze. Man kann das nachträglich aber einbauen, weil man durchaus bei jedem Absatz etwas ausführen kann. Auf TeX-ebene geht das mit \everypar. Allerdings verwendet LaTeX \everypar intern ebenfalls, so dass man einiges an Aufwand investieren muss, damit das nicht nur im normalen Text funktioniert. Da ich das gesamte Vorhaben als Spielerei interpretiere, denke ich nicht, dass es sich lohnt, wenn ich diesen Aufwand jetzt investieren würde.

Absatzanfang ist hingegen einfach herauszufinden. Am Absatzanfang befindet man sich im vertikalen Modus, während man sich innerhalb des Absatzes im horizontalen Modus befindet. Näheres dazu ist der TeX-Doku zu entnehmen.

Doku für fortgeschrittene Anwender, die sich u. a. auch mit TeX-Programmierung beschäftigt, findet sich ebenfalls über die zweite Zeile meiner Signatur.

RalfR
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 13. Okt 2010, 19:00

Beitrag von RalfR »

Gibt es denn nicht vieleicht interne Variablen, die z.B. die aktuelle
Position im Text (z.B. wieviele Zeichen wurden schon geparst),
auf die man einfach zugreifen könnte?

Ich suche z.B. nach einer Liste der "Systemzustände", habe dazu
aber noch nichts gefunden.

Danke auch für die Links.

Ralf

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

Du kannst nur mit LuaTeX auf den internen Zustand des Interpreters zugreifen; das "klassische" TeX hat kaum entsprechenden Möglichkeiten.
XeTeX bietet eine sehr eingeschränkte Möglichkeit, auf bestimmte Zeichenkombinationen zu reagieren (Zeichenklassen).
Im "klassischen" TeX gibt es den Hook \everypar, der bei jedem Absatzanfang ausgeführt wird.

Hier ein Ansatz für eine Realisierung mit LuaLaTeX:
\documentclass{article} 
\usepackage{luatextra}
\usepackage[T1]{fontenc} 
\usepackage[english,german,ngerman]{babel} 
\selectlanguage{german} 

\RequirePackage[left=3.0cm,top=2.5cm,right=2cm,bottom=3.0cm]{geometry} 

\usepackage[utf8]{luainputenc} 
\usepackage{xspace} 
\usepackage{everyhook}

\newcounter{namecounter} 
\setcounter{namecounter}{1} 

\newluaattribute{\autocapitalize}

\newcommand{\name}{%
  \setluaattribute{\autocapitalize}{1}%
  \ifodd\value{namecounter}%
  Herr Müller%
  \else 
  er%
  \fi 
  \setluaattribute{\autocapitalize}{0}%
  \stepcounter{namecounter}%
  \xspace
} 

\PushPreHook{par}{\setcounter{namecounter}{1}}

\begin{luacode}
function auto_capitalize(head, groupcode)
  local v = head
  while v do
    if v.id == 37 and v.char == 46 then
      v = v.next
      if v and v.id == 10 then
        v = v.next
        if v and v.id == 37 and node.has_attribute(v, luatexbase.attributes.autocapitalize, 1) then
          v.char = tex.getuccode(v.char)
        end
      end
    end
    v = v.next
  end
end

luatexbase.add_to_callback("pre_linebreak_filter", auto_capitalize, "auto_capitalize")
\end{luacode}

\begin{document} 
\name ist Reporter. \name kommt in der ganzen Welt herum, um Recherchen und Interviews zu machen. 
\name hat Journalistik studiert.  Wenn \name nochmal zu entscheiden hätte, würde er es wieder genauso machen. \name mag seine Arbeit sehr. 

Jetzt wechseln wir das Thema und sprechen kurz über etwas ganz Anderes: Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. at vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet 

Aber wieder zurück zum Journalismus: \\ 
{\Huge\name} ist derzeit in Amerika, um dort Kongreßabgeordnete zu interviewen. 

\end{document} 

RalfR
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 13. Okt 2010, 19:00

Beitrag von RalfR »

Allein die Möglichkeit, Anweisungen aus einer strukturierten
Interpretersprache einzubetten, sieht ja ziemlich vielversprechend
aus!

Ich arbeite mit MikTex unter Windows Vista.
Die lua-Packages habe ich soweit eben installiert,
kriege aber noch eine Fehlermeldung:

! Undefined control sequence.
l.16 \newluaattribute
{\autocapitalize}
?

An sich sollte das Package doch mit MikTex funktionieren,
oder?

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

Es sollte unabhängig von der Distribution funktionieren, aber es ist möglich, dass in MikTeX noch nicht alle Pakete ganz aktuell sind. Hier zum Vergleich meine Dateiliste:
 *File List*
 article.cls    2007/10/19 v1.4h Standard LaTeX document class
  size10.clo    2007/10/19 v1.4h Standard LaTeX file (size option)
luatextra.sty    2010/08/02 v0.971 LuaTeX extra low-level macros
ifluatex.sty    2010/03/01 v1.3 Provides the ifluatex switch (HO)
luatexbase-modutils.sty    2010/05/27 v0.2a Module utilities for LuaTeX
luatexbase-loader.sty    2010/05/27 v0.2a Lua module loader for LuaTeX
luatexbase-compat.sty    2010/05/27 v0.2a Compatibility tools for LuaTeX
luatexbase-attr.sty    2010/05/27 v0.2a Attributes allocation for LuaTeX
luatexbase-cctb.sty    2010/05/27 v0.2a Catcodetable allocation for LuaTeX
luatexbase-regs.sty    2010/05/27 v0.2a Registers allocation for LuaTeX
    etex.sty    1998/03/26 v2.0 eTeX basic definition package (PEB)
luatexbase-mcb.sty    2010/05/27 v0.2a Callback management for LuaTeX
 environ.sty    2008/06/18 v0.2 A new way to define environments
luaotfload.sty    2010/10/16 v1.20 OpenType layout system
 fontenc.sty
   t1enc.def    2005/09/27 v1.99g Standard LaTeX file
   babel.sty    2008/07/06 v3.8l The Babel package
 english.ldf    2005/03/30 v3.3o English support from the babel system
 germanb.ldf    2008/06/01 v2.6m German support from the babel system
ngermanb.ldf    2008/07/06 v2.6n new German support from the babel system
geometry.sty    2010/09/12 v5.6 Page Geometry
  keyval.sty    1999/03/16 v1.13 key=value parser (DPC)
   ifpdf.sty    2010/01/28 v2.1 Provides the ifpdf switch (HO)
  ifvtex.sty    2010/03/01 v1.5 Switches for detecting VTeX and its modes (HO)
 ifxetex.sty    2010/09/12 v0.6 Provides ifxetex conditional
luainputenc.sty    2010/05/10 v0.97 inputenc package for LuaTeX
   lutf8.def    2010/05/10 v0.97 UTF-8 support for luainputenc
   t1enc.dfu    2008/04/05 v1.1m UTF-8 support for inputenc
  ot1enc.dfu    2008/04/05 v1.1m UTF-8 support for inputenc
  omsenc.dfu    2008/04/05 v1.1m UTF-8 support for inputenc
  xspace.sty    2006/05/08 v1.12 Space after command names (DPC,MH)
everyhook.sty    2010/09/27 v1.0 (SVN Rev: 9)\ Hooks for low level TeX everyX primitives.
svn-prov.sty    2010/04/24 v3.1862 Package Date/Version from SVN Keywords
etoolbox.sty    2010/09/12 v2.0a e-TeX tools for LaTeX
 ***********

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

phi hat geschrieben:Es sollte unabhängig von der Distribution funktionieren, aber es ist möglich, dass in MikTeX noch nicht alle Pakete ganz aktuell sind.
War es bei MiKTeX nicht außerdem so, dass Binaries wie pdftex, luatex und xetex zwischen den MiKTeX-Releases nicht aktualisiert wurden, sondern ggf. nur Fehler in den Binaries beseitigt wurden? In dem Fall sollten lualatex-Anwender eventuell zumindest MiKTeX 2.9 verwenden.

RalfR
Forum-Anfänger
Forum-Anfänger
Beiträge: 25
Registriert: Mi 13. Okt 2010, 19:00

Beitrag von RalfR »

Habe MikText2.9 installiert,
die Packages alle importiert und aktualisiert,
aber der Fehler ist noch der gleiche.

Wie kriege ich die *filelist* so gelistet?

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

KOMA hat geschrieben:
phi hat geschrieben:Es sollte unabhängig von der Distribution funktionieren, aber es ist möglich, dass in MikTeX noch nicht alle Pakete ganz aktuell sind.
War es bei MiKTeX nicht außerdem so, dass Binaries wie pdftex, luatex und xetex zwischen den MiKTeX-Releases nicht aktualisiert wurden, sondern ggf. nur Fehler in den Binaries beseitigt wurden?
Das kann natürlich sein, ich würde aber dann auf eine andere Fehlermeldung tippen. \newluaattribute ist einfach ein TeX-Makro. Vermutlich ist eher das luatextra-Paket zu alt.

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Beitrag von phi »

RalfR hat geschrieben:Wie kriege ich die *filelist* so gelistet?
Einfach \listfiles an den Dateianfang (noch vor \documentclass) setzen. Die Dateiliste wird dann am Ende der Compilerausgabe ausgegeben.

Antworten