von phi » Mo 1. Nov 2010, 13:56
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}
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:
[code]\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} [/code]