这是代码:
\documentclass{article}
\NewDocumentCommand\foo{v}{\texttt{#1}}
\catcode`\|\active\def|{\foo|}
\usepackage{tikz}
\begin{document}
Hello, |world|!
\end{document}
它无法编译。我该怎么办?
顺便说一句,我不能把它放在\usepackage{tikz}
上面\catcode
。这只是一段实验性的代码。我的真实情况要复杂得多:我更改了包中垂直条的 catcode,它可以在之前或之后使用tikz
。
顺便说一句,以某种方式ltxdoc
解决了这个问题,并且此代码运行良好:
\documentclass{ltxdoc}
\usepackage{tikz}
\begin{document}
Hello, |world|!
\end{document}
答案1
在所有的包都加载完成之前,你不应该改变 catcodes。ltxdoc
用来\AtBeginDocument
尽可能晚地使条形字符处于活动状态:
\documentclass{article}
\NewDocumentCommand\foo{v}{\texttt{#1}}
\begingroup
\catcode`\|\active
\newcommand*\usemybar{}% To get an error message, if it has already been defined.
\gdef\usemybar{\catcode`\|\active\def|{\foo|}}
\endgroup
\AtBeginDocument{\usemybar}
\usepackage{tikz}
\begin{document}
Hello, |world|!
\end{document}
但是,我还建议定义一个命令来重置 catcode。这样您(或其他用户)就可以在需要时轻松切换回来。为此,您可以添加类似以下内容的内容:
\documentclass{article}
\NewDocumentCommand\foo{v}{\texttt{#1}}
\newcommand*{\resetbar}{}
\edef\resetbar{\noexpand\catcode`\|\the\catcode`|}
\begingroup
\catcode`\|\active
\newcommand*\usemybar{}% To get an error message, if it has already been defined.
\gdef\usemybar{\catcode`\|\active\def|{\foo|}}
\endgroup
\AtBeginDocument{\usemybar}
\usepackage{tikz}
\begin{document}
Hello, |world|!
\resetbar
\begin{tabular}{|l|}% Without \resetbar this would be a problem!
No Problem!
\end{tabular}
\usemybar
Hello, |world|!
\end{document}