我想调试一个 latex 宏,但我不知道该怎么做。我得到了以下 MWE,它替换了\\
字符串中的。我想打印生成的字符串的值来检查结果。第一个输出\show
与预期一致\textbf {Test123\\Test234}
。现在我想输出宏\addrGlobal
,以便它显示\textbf {Test123\newline Test234}
,但它不能按预期工作。如何实现此输出?
提前致谢!
\documentclass{article}
\usepackage[a4paper,top=1.27cm,left=1cm,right=1cm,bottom=2cm]{geometry}
\usepackage{ifpdf}
\usepackage[utf8x]{inputenc}
\usepackage{xstring}
\def\address{\textbf{Test123\\Test234}}
\newcommand{\addrGlobal}{%
\ifx\@empty\address\else
\saveexpandmode\expandarg
\StrSubstitute{\address}{\empty\\}{\empty\newline}[\addr]%
\restoreexpandmode\addr%
}%
\relax
\show\address
\show\addrGlobal
\begin{document}
\end{document}
答案1
您的代码中存在各种问题。
- 为什么要检查是否
\address
为空?你刚刚已经定义了它不为空。 \makeatletter
并且\makeatother
缺少使用的代码\@empty
- 该字符串
\empty\\
未出现在中\address
,因此没有任何改变。 \addrGlobal
\addr
执行时不会包含字符串,而是包含\addrGlobal
,而这不在您的代码中。除非您不发出\addrGlobal
,否则 不会赋予 任何值\addr
。
这是一个可能的解决办法。
\documentclass{article}
\usepackage{xstring}
\def\address{\textbf{Test123\\Test234}}
\newcommand{\fixaddress}{%
\saveexpandmode\expandarg\exploregroups
\StrSubstitute{\address}{\noexpand\\}{\newline}[\addrGlobal]%
\restoreexpandmode
}
\show\address
\fixaddress
\show\addrGlobal
注意,\noexpand\\
为了不扩展要搜索的字符串,并且\exploregroups
。\ifx\@empty\address
测试是无用的,因为如果字符串为空,则不会执行任何替换。
以下是终端上的输出:
> \address=macro:
->\textbf {Test123\\Test234}.
l.13 \show\address
?
> \addrGlobal=macro:
->\textbf {Test123\protect \newline Test234}.
l.15 \show\addrGlobal