我正在尝试编写一个带有缩写宏的包\PackageError
,并且我特别想用它来报告诸如
Parameter #1 cannot be "s"
(假设我的输入验证确定用户输入了类似的内容
\somemacro{s}
并且\somemacro
实际上不能将其s
作为其第一个参数)的消息。
\#
(没有保护),
\protect\#
并且
\protect\char`\#
全部产生\#
而不是#
。
\protect#
产生并显示错误
ERROR: Illegal parameter number in definition of .
(也就是说,在这种情况下,我的错误报告系统本身会引发错误)。
那么,是否可以打印#
其中的文字\PackageError
?
一位 MWE 表示:
\documentclass{article}
\newcommand*{\myerror}[1]{%
\PackageError
{Some package}
{#1}
{}% no extra help
}
\begin{document}
Hello, world!
\myerror{%
\protect\#1 doesn't work,
but \protect~ does
}
\end{document}
也就是说,
\protect~
打印一个~
。
- 编辑 -
因为我不能接受多个答案,所以我想指出
antshar 的回答,
大卫·卡莱尔的回答, 和
Ulrike Fischer 的评论#
都提供了从内部 打印的方法\PackageError
。由于我想不出一个比其他更好的理由,所以我将接受网站声誉较低的用户的答案。
考虑以下代码:
\documentclass{article}
\begingroup
\catcode`#=11
\gdef\hashA{#}
\endgroup
\newcommand*{\hashB}{\csname c_hash_str\endcsname}
\newcommand*{\myerror}[1]{%
\PackageError
{Some package}
{#1}
{}% no extra help
}
\begin{document}
Hello, world!
\myerror{%
These three forms print a hash symbol followed by "1":
\hashA1
\protect##1
\hashB1
}
\end{document}
这正确地停止了编译并打印
ERROR: Package Some package Error: These three forms print a hash symbol followed by "1": #1 #1 #1 .
到终端。
答案1
您可以将其保存#
为字母而不是活动字符\catcode
,然后将其分配给宏。
\documentclass{article}
\newcommand*{\myerror}[1]{%
\PackageError
{Some package}
{#1}
{}% no extra help
}
\begin{document}
Hello, world!
\begingroup
\catcode`#=11
\gdef\hash{#}
\endgroup
\myerror{%
\hash1 does work,
and \protect~ works
}
\end{document}
答案2
! Package Some package Error: #1 doesn't work, but ~ does .
See the Some package package documentation for explanation.
Type H <return> for immediate help.
...
l.16 }
?
从
\documentclass{article}
\newcommand*{\myerror}[1]{%
\PackageError
{Some package}
{#1}
{}% no extra help
}
\begin{document}
Hello, world!
\myerror{%
\protect##1 doesn't work,
but \protect~ does
}
\end{document}