我正在使用 xelatex 并尝试将包含逗号的文本段斜体化。我知道的唯一方法是使用 xesearch 及其命令 SearchList。它在大多数情况下都有效,但如果短语包含逗号,我似乎根本无法将整个短语作为单个参数传递给命令(通过转义逗号)。以下是我正在尝试执行的操作的示例:
\documentclass[11pt, a4paper]{article}
\usepackage{xesearch}
\begin{document}
a, b, abc, b, a, b, c
\SearchList*{list1}{\textit{#1}}{a, b}
a, b, abc, b, a, b, c
\StopList{list1}
\end{document}
这样做可以匹配 a,但不会在任何位置将 b 斜体化。罪魁祸首似乎是作为参数传递给 SearchList 的 b 前面的空格。删除空格后,该行现在显示为
\SearchList*{list1}{\textit{#1}}{a,b}
导致单个 a 和 b 被斜体化(正如预期的那样)。
但是,我专门尝试将片段“a, b”斜体化(字母之间有逗号和空格),忽略字母 b 的其他实例。所有出现的“a, b”——在本例中是两个——都应该斜体化。
我已尝试按照此处的建议添加括号:我如何逃避逗号? 尽管我必须承认我不完全理解 Latex 中的转义序列。这是我尝试过的:
\documentclass[11pt, a4paper]{article}
\usepackage{xesearch}
\begin{document}
a, b, abc, b, a, b, c
\UndoBoundary{,}
\SearchList*{list1}{\textit{#1}}{{a, b}}
a, b, abc, b, a, b, c
\StopList{list1}
\MakeBoundary{,}
\end{document}
这似乎没有任何作用。如能提供任何帮助,我将不胜感激。
答案1
我不知道 xesearch 包,但你可以使用expl3
正则表达式:
\documentclass[11pt, a4paper]{article}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_protected:Npn \zz #1
{
\tl_set:Nn \l_tmpa_tl { #1 }
\regex_replace_all:nnN {a,\s b}{\c{textit}\cB\{\0\cE\}} \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
a, b, abc, b, a, b, c
\zz{a, b, abc, b, a, b, c}
\end{document}
答案2
一种listofitems
方法。
\documentclass[11pt, a4paper]{article}
\usepackage{listofitems}
\begin{document}
a, b, abc, b, a, b, c
\setsepchar{a, b}
\readlist\mylist{a, b, abc, b, a, b, c}
\foreachitem\i\in\mylist{\ifnum\icnt>1\relax\textit{\mylistsep[\icnt]}\fi\i}
\end{document}
以宏形式来说,可以这样做:
\documentclass[11pt, a4paper]{article}
\usepackage{listofitems}
\newcommand\mysearch[2][a, b]{%
\setsepchar{#1}%
\readlist\mylist{#2}%
\foreachitem\i\in\mylist{\ifnum\icnt>1\relax\textit{\mylistsep[\icnt]}\fi\i}%
}
\begin{document}
a, b, abc, b, a, b, c
\mysearch{a, b, abc, b, a, b, c}
\mysearch[abc, b]{a, b, abc, b, a, b, c}
\end{document}