如何解决垂直条的新 \catcode 和“tikz”之间的冲突

如何解决垂直条的新 \catcode 和“tikz”之间的冲突

这是代码:

\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}

相关内容