
Ist es möglich und darüber hinaus sinnvoll, LaTeX dazu zu bringen, bestimmte Wörter automatisch auf eine bestimmte Weise zu formatieren? Nehmen wir beispielsweise an, ich möchte jedes Vorkommen des Wortes „Hallo“ in einer fetten, cyanfarbenen Monospace-Schriftart haben, während der Rest des Dokuments normal, serifenlos und schwarz bleibt.
Wie kann ich das erreichen, ohne jedes Mal vor der Kompilierung der TEX-Datei eine Suchen-und-Ersetzen-Funktion durchführen zu müssen, um „Hallo“ in einen benutzerdefinierten Befehl einzufügen?
Antwort1
Kompilieren Sie dies mit XeLaTeX
\documentclass{article}
\usepackage{color,xesearch}
\SearchList*{redwords}{\textcolor{red}{#1}}{hello}
\begin{document}
This is hello and this is hellow.
\end{document}
Aber verwenden Sie es nicht. Wenn Sie ein Wort besonders markieren möchten, verwenden Sie ein Makro.
Warum? Sich auf automatische Verfahren zu verlassen ist immer riskant: Wenn ich die Wahl habe, bevorzuge ich explizite Markierungen. Ein weiterer Grund ist, dass es xesearch
ressourcenhungrig ist und derzeit nicht gewartet wird.
Es gibt nichts Ähnliches für pdflatex
; möglicherweise kann mit LuaLaTeX etwas gemacht werden. Ich habe es versucht, chickenize
aber es scheint diese Funktion nicht anzubieten.
Antwort2
Ein bisschen spät dran, aber hier ist eine LuaLaTeX-basierte Lösung. Sie richtet eine Funktion ein, die die Eingabe scanntVorTeX führt die übliche Verarbeitung durch; alle Instanzzeichenfolgen hello
werden „on the fly“ durch ersetzt {\ttfamily\bfseries\color{cyan}hello}
, um von LaTeX verarbeitet zu werden.
\documentclass{article}
\usepackage{fontspec}
\setmonofont{Courier New}[BoldFont="Courier New Bold"]
\usepackage{luacode,xcolor}
\begin{luacode}
function hello ( s )
return (string.gsub(s , "(hello)(%L)", "{\\ttfamily\\bfseries\\color{cyan}%1}%2"))
end
\end{luacode}
\AtBeginDocument{\directlua{
luatexbase.add_to_callback("process_input_buffer", hello, "hello")}}
\begin{document}
hello hellow Hello hello.
\end{document}
Antwort3
In ConTeXt können Sie das translate
Modul verwenden, um solche Suchen und Ersetzungen zur Kompilierungszeit durchzuführen:
\usemodule[translate]
\definehighlight[SPECIAL][color=cyan, style=\ttbf]
\def\HELLO{\SPECIAL{hello}}
\translateinput[hello][\HELLO{}]
\enableinputtranslation
\setupbodyfont[ss,12pt]
\starttext
When you greet people, you say hello.
\stoptext
Das Ergebnis ist:
Antwort4
Für meine Unterhaltung bei der VerwendungLaTeX3definiert der folgende Code eine Umgebung boldwords
, die eine durch Kommas getrennte Liste von Wörtern akzeptiert, die innerhalb der Umgebung fett gesetzt werden sollen. Das Ausführen des MWE erzeugt:
Beachten Sie insbesondere, dass „ log
in“ catalogue
nicht fett dargestellt wird, da es sich nicht um ein vollständiges Wort handelt.
\documentclass{article}
\usepackage{environ}
\usepackage{expl3}
\ExplSyntaxOn
\clist_new:N \l_bold_word_clist
\tl_new:N \l_BODY_tl
\NewEnviron{boldwords}[1]{
\clist_set:Nn \l_bold_word_clist {#1}
\tl_set:No \l_BODY_tl {\BODY}
\clist_map_inline:Nn \l_bold_word_clist {
\regex_replace_all:nnN {\b##1\b} { \c{textbf}\cB\{##1\cE\} } \l_BODY_tl
}
\l_BODY_tl
}
\ExplSyntaxOff
\begin{document}
\begin{boldwords}{dog, log}
a dog, a cat, a frog a log and a catalogue
a dog, a cat, a frog a log and a catalogue
a dog, a cat, a frog a log and a catalogue
a dog, a cat, a frog a log and a catalogue
a dog, a cat, a frog a log and a catalogue
\end{boldwords}
\end{document}