关于python:如何在\PackageError中\protect'#'?

关于python:如何在\PackageError中\protect'#'?

我正在尝试编写一个带有缩写宏的包\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}

相关内容