我正在尝试打印垂直线符号,但它是\active
文档ltxdoc
样式(此代码无法编译):
\documentclass{ltxdoc}
\begin{document}
This is a vertical bar: |\||
\end{document}
我希望栏位位于|...|
格式内,本质上是\texttt{...}
此文档样式。有什么解决方案吗?
答案1
一个容易理解的解决方案是
%! TEX program = pdflatex
\documentclass{ltxdoc}
\usepackage[T1]{fontenc} % pdflatex only!! in other engine omit this line or specify encoding TU
% in pdflatex without this line the vertical bar would not be in typewriter font
\begin{document}
\texttt{ab\textbar cd}
\end{document}
您将无法|ab\textbar cd|
在此处使用,因为它是逐字的并且将\textbar
逐字打印(尽管如此,|ab\textbar cd|
如果它是一个“真实参数”,则可以在另一个命令的参数中使用,但我不建议依赖这种不一致的行为,会造成混淆)
为了使事情变得过于复杂,这是一个允许您|
通过加倍来逃避的解决方案。
%! TEX program = pdflatex
\documentclass{ltxdoc}
\ExplSyntaxOn
\makeatletter
\char_set_catcode_active:N \|
\AtBeginDocument{
\char_set_active_eq:NN \| \__usersixdigits_vertical_bar_active_do:w
}
\char_set_catcode_other:N \|
\cs_new_protected:Npn \__usersixdigits_vertical_bar_active_do:w {
\begingroup
\let\do\@makeother
\dospecials
\__usersixdigits_grab_following_argument:w
}
\cs_new_protected:Npn \__usersixdigits_grab_following_argument:w #1 | {
\endgroup % reset the catcode of the following character (which might not be |)
\texttt{#1} % typeset the text collected so far
% the following peek will tokenize the following argument, so it's important to |\endgroup| above
\peek_meaning_remove:NT \__usersixdigits_vertical_bar_active_do:w % we assume nothing other than the active | has this meaning
{
\texttt{|} % assuming the current font has the | character in the correct slot (which means either T1/TU encoding or OT1 typewriter font)
\__usersixdigits_vertical_bar_active_do:w
}
}
\makeatother
\ExplSyntaxOff
\begin{document}
some text |12||34|
vertical bar ||||
vertical bar |||| abc
ab|x||y|cd
ab|x||y|\{cd
\end{document}
输出正如您所期望的。
答案2
横线只是 的简写\verb
。因此,您可以\verb
像往常一样直接使用文本中没有的分隔符:
\documentclass{ltxdoc}
\begin{document}
This is a vertical bar:
\verb+|+
\end{document}
附言:内部 |...| 格式是错误的概念。简写与格式无关(格式可以更改),但允许逐字排版。如果你想格式在打字机中,使用\texttt
和\textbar
(\|
无论栏是否处于活动状态,都不起作用,就像\|
数学命令一样)。如果您希望栏像这样工作,则\texttt
必须先重新定义它。