
Возможно ли и, более того, конструктивно заставить LaTeX автоматически форматировать определенные слова определенным образом? Допустим, например, я хотел бы, чтобы каждое вхождение слова «привет» было жирным голубым моноширинным шрифтом, тогда как остальная часть документа оставалась бы обычной, без засечек и черной.
Как мне этого добиться, не выполняя поиск и замену для помещения «hello» в пользовательскую команду каждый раз перед компиляцией .tex-файла?
решение1
Скомпилируйте это с помощью XeLaTeX
\documentclass{article}
\usepackage{color,xesearch}
\SearchList*{redwords}{\textcolor{red}{#1}}{hello}
\begin{document}
This is hello and this is hellow.
\end{document}
Но не используйте его. Если вы хотите специально отметить слово, используйте макрос.
Почему? Полагаться на автоматические процедуры всегда рискованно: если у меня есть выбор, я предпочитаю явную разметку. Другая причина в том, что xesearch
это ресурсоемко и в настоящее время не поддерживается.
Ничего похожего для pdflatex
; возможно, что-то можно сделать с LuaLaTeX. Я пробовал, chickenize
но, похоже, он не предлагает эту функцию.
решение2
Немного опоздал на вечеринку, но вот решение на основе LuaLaTeX. Оно устанавливает функцию, которая сканирует входные данныедоTeX выполняет всю обычную обработку; любые строки экземпляров hello
заменяются «на лету» на {\ttfamily\bfseries\color{cyan}hello}
, подлежащие обработке LaTeX.
\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}
решение3
В ConTeXt вы можете использовать translate
модуль для выполнения поиска и замены во время компиляции:
\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
который дает:
решение4
Для моего развлечения при использованииLaTeX3, код ниже определяет среду boldwords
, которая принимает список слов, разделенных запятыми, которые должны быть набраны жирным шрифтом внутри среды. Запуск MWE дает:
Обратите внимание, что log
in catalogue
не выделено жирным шрифтом, поскольку это не полное слово.
\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}