我正在写一份科学报告,它要求我写一堆掩码,其中掩码通常是带有 #、_ 字符的字符串。例如###_#__##_##_####
是一个掩码。但 latex 不允许我在文本中写 #,而 _ 被解释为下划线。
我知道我可以使用转义序列(即 \#)来编写#字符,但我发现在整篇论文中写多个这样的掩码非常麻烦。我正在寻找一种优雅的方式来制作原始文本,这样它就可以直接写入文本,而无需对其中的字符进行任何解释。
我找不到任何相关的问题来回答这个问题。任何帮助都将不胜感激。
编辑:正如一些人建议的那样,命令 \textbackslash 在数学模式下无效这个问题回答了,但是对于想要使用原始字符串的初学者来说,除非有人指出这一点,否则他们无法从上述问题中找到答案。因此,我建议保持这个问题关闭,但不要删除它。
答案1
您可能使用\verb|###_#__##_##_####|
,但是这存在一个问题,即它不能作为另一个命令的参数。
另一种策略可能是使用1
来表示#
,并0
来表示下划线。这样,您也可以通过仅根据定义进行操作来非常简单地修改最终外观。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\mask}{m}
{
% we want monospaced text
\texttt
{
% process the input one character at the time
\str_map_inline:nn { #1 }
{
% if the input is 1, output \#`; if 0, output \_
\str_case:nn { ##1 } { {0}{\_} {1}{\#} }
}
}
}
\ExplSyntaxOff
\begin{document}
Here's a mask \mask{11101001101101111}
\end{document}
不过,您也可以保留原始输入;由于标记到字符串的转换会使#
字符数翻倍,因此我们需要在映射之前##
对字符串化的输入进行规范化并替换#
。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\mask}{m}
{
\texttt
{
\str_set:Nn \l_tmpa_str { #1 }
\str_replace_all:Nxx \l_tmpa_str { \c_hash_str \c_hash_str } { \c_hash_str }
\str_map_inline:Nn \l_tmpa_str
{
\str_case_e:nn { ##1 }
{
{\c_underscore_str}{\_}
{\c_hash_str}{\#} }
}
}
}
\cs_generate_variant:Nn \str_replace_all:Nnn { Nxx }
\ExplSyntaxOff
\begin{document}
Here's a mask \mask{###_#__##_##_####}
\end{document}
输出与以前相同。