X
我一直在使用类似这样的宏
\newcommand{\X}[1]{{\ttfamily{\detokenize{#1}}}}
格式化可能包含下划线的某些单词,而无需使用 转义\_
。这一直有效,直到我在 中使用它\caption
。这导致 pdflatex 和 lualatex ( ) 都出现错误! Missing $ inserted.
。考虑这个 MWE:
\documentclass{article}
\newcommand{\X}[1]{{\ttfamily{\detokenize{#1}}}}
\begin{document}
\listoffigures
\begin{figure}
\centering
\caption{One \X{a_b} Two}
\end{figure}
\end{document}
我是否必须使用不同的/更复杂的解决方案,X
或者我应该通常转义下划线?我对最佳实践更感兴趣,而不是非常聪明的黑客。
答案1
您需要命令足够强大,否则.lof
文件中的注释将变成
\contentsline {figure}{\numberline {1}{\ignorespaces One \texttt {a_b} Two}}{1}%
(我将语法从 改为,{\ttfamily...}
这样\texttt{...}
更好)。如您所见,\detokenize
已被应用并消失。
另一方面,如果你这样做
\newcommand{\X}{}% for safety
\DeclareRobustCommand{\X}[1]{\texttt{\detokenize{#1}}}
注释将是
\contentsline {figure}{\numberline {1}{\ignorespaces One \X {a_b} Two}}{1}%
问题就不会显现出来。
或者,\protect\X
在移动争论中使用。