我有一个用于打印消息的宏\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}%$}