amsmath 搞乱了标签黑客

amsmath 搞乱了标签黑客

我正在将给定的代码改编为 LaTeX3那里提供一个不显示其内容但考虑其标签的环境。

思路是先将内容排版到vbox中丢弃,但在此之前,\label先将的含义改为\qlabel,将标签信息存入clist中,然后再用 处理clist,将\dolabels相关标签信息输出到.aux

这似乎有效……直到amsmath加载,无论是在代码之前还是之后。发生的事情是对非排版标签的引用未定义。我有理由相信,这amsmath在某种程度上使得改变的含义变得困难\label(clist 保持为空),但我完全不知道如何避免这种情况。

这是我的代码。按原样编译(使用 LuaLaTeX)会在末尾给出引用 (2) (1) (4)。取消注释其中一个\usepackage{amsmath}会给出 (??) (1) (4)。

\documentclass{article}

%\usepackage{amsmath}
\ExplSyntaxOn
\makeatletter

\clist_new:N \g__chato_exo_labels_cl
\box_new:N \l__chato_exo_dummy_box

\cs_new:Nn\cs__chato_exo_dolabels:nnn{\@bsphack \protected@write \@auxout {}{\string \newlabel {#1}{{#2}{#3}}}\@esphack}
\cs_new:Nn\cs__chato_exo_qlabel:n{\clist_gput_right:Nx \g__chato_exo_labels_cl { {{#1}{\@currentlabel}{\thepage}} } }


\NewDocumentEnvironment{question}{O{}}
{\begingroup\let\ltx@label\cs__chato_exo_qlabel:n\vbox_set:Nw \l__chato_exo_dummy_box}
{\vbox_set_end:\endgroup\clist_map_inline:Nn \g__chato_exo_labels_cl {\cs__chato_exo_dolabels:nnn ##1}}

\makeatother
\ExplSyntaxOff

%\usepackage{amsmath}

\begin{document}

\begin{equation}
i,i,i, \label{eq2}
\end{equation}

\begin{question}[truc]
choucroute
\begin{equation}
i,i,i, \label{eq1}
\end{equation}

\begin{equation}
oon \label{eq}
\end{equation}
\end{question}

\begin{equation}
i,i,i, \label{eq3}
\end{equation}

(\ref{eq1}) (\ref{eq2}) (\ref{eq3})
\end{document}

答案1

感谢 Ulrike Fischer 指出了这\ltx@label一点。这是原始的加载\label时间amsmath——我一直在摸索这一切,以至于我忘记了这一点。

感谢您指出 的问题hyperref。我通过获取它赋予 的含义\label并存储相关信息来编译它。我没有检查链接是否真的有效——我当然不希望链接到非排版部分。

编辑:amsmath与 的冲突\label不是全局性的(在加载包时),而是在启动数学环境时在本地发生的。因此,如果我们只改变 的含义\ltx@label,我们就能使方程式起作用,但图形的标题却不起作用(因为它们使用的是原始的\label)。

因此我们需要改变两者:

\ExplSyntaxOn
\makeatletter

\clist_new:N \g__chato_exo_labels_cl
\box_new:N \l__chato_exo_dummy_box


\@ifpackageloaded{hyperref}
  {
    \cs_new:Npn\cs__chato_exo_dolabels#1#2#3#4#5{\@bsphack \begingroup \def \label@name {#1}\label@hook \protected@write \@auxout {}{\string \newlabel {#1}{{#2}{#3}{#4}{#5}{}}}\endgroup \@esphack}
    \cs_new:Nn\cs__chato_exo_qlabel:n{\clist_gput_right:Nx \g__chato_exo_labels_cl { {{#1}{\@currentlabel}{\thepage}{\@currentlabelname}{\@currentHref}} } }
  }
  {
    \cs_new:Npn\cs__chato_exo_dolabels#1#2#3{\@bsphack \protected@write \@auxout {}{\string \newlabel {#1}{{#2}{#3}}}\@esphack}
    \cs_new:Nn\cs__chato_exo_qlabel:n{\clist_gput_right:Nx \g__chato_exo_labels_cl { {{#1}{\@currentlabel}{\thepage}} } }
  }

\NewDocumentEnvironment{question}{O{}}
{\group_begin:\cs_set_eq:NN\label\cs__chato_exo_qlabel:n
\@ifpackageloaded{amsmath}{\cs_set_eq:NN\ltx@label\cs__chato_exo_qlabel:n}{}\vbox_set:Nw \l__chato_exo_dummy_box}
{\vbox_set_end:\group_end:\clist_map_inline:Nn \g__chato_exo_labels_cl {\cs__chato_exo_dolabels ##1}}

\makeatother
\ExplSyntaxOff 

相关内容