输出生成的宏内容并换行

输出生成的宏内容并换行

我想调试一个 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

您的代码中存在各种问题。

  1. 为什么要检查是否\address为空?你刚刚已经定义了它不为空。
  2. \makeatletter并且\makeatother缺少使用的代码\@empty
  3. 该字符串\empty\\未出现在中\address,因此没有任何改变。
  4. \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

相关内容