在 typeout 中取消转义命令参数

在 typeout 中取消转义命令参数

我有一个用于打印消息的宏\typeout。我想取消转义这些消息。

\newcommand{\mymessage}[1]{
  \typeout{#1}
}

然后就\mymessage{foo\#bar}可以打印了foo#bar。现在就可以打印了foo\#bar

编辑:

下面的答案显示了如何解决取消转义\#字符的具体问题。但是,这只是一个例子。我还需要取消转义\%和任何其他此类组合。

答案1

编辑以跟进 OP 的修改。

也许这对于您尚未明确指定但未知的限制来说是可以的:

\documentclass{article}
\newcommand{\mymessage}[1]{\bgroup\escapechar-1 \typeout{\detokenize{#1}}\egroup}

\begin{document}

\mymessage{foo\#bar\!foo\%hello\&world}
\end{document}

生成:

foo#bar!foo%hello&world

原始答案

如果你没有使用\mymessage内部宏,你可以尝试

\documentclass{article}
\newcommand{\mymessage}{\bgroup\lccode`~=`\\\lowercase{\let~\string}%
                        \catcode92 13 \mynoescapemessage}
\newcommand{\mynoescapemessage}[1]{\typeout{#1}\egroup}

\begin{document}

\mymessage{foo\#bar\!foo\hello\world}
\end{document}

生成:

foo#bar!foohelloworld

请注意,事情有点复杂(我可以选择 catcode 9(又名“忽略”))的原因是为了避免:

foo##bar

这是由于 TeX 对#标记的特殊处理。

答案2

重新定义\#(本地):

\newcommand{\mymessage}[1]{%
  \begingroup\edef\#{\string##}%
  \typeout{#1}%
  \endgroup
}

\mymessage{foo\#bar}

输出为

foo#bar

请小心保护宏定义中的行尾。

添加转义代码的方法如下:

\makeatletter
\newcommand{\mymessage}[1]{%
  \begingroup\mymessage@escapes
  \typeout{#1}%
  \endgroup
}

\newcommand{\mymessage@escapes}{%
  \edef\#{\string##}%
  \let\%\@percentchar % already provided by LaTeX
  \edef\{{\string{}\edef\}{\string}}%
  \edef\${\string$}%
}

\mymessage{\{foo\#{bar}\%\$\}}

还请注意,在 中平衡括号不需要进行转义\typeout

输出为

{foo#{bar}%$}

相关内容