![amsmath 搞乱了标签黑客](https://linux22.com/image/454183/amsmath%20%E6%90%9E%E4%B9%B1%E4%BA%86%E6%A0%87%E7%AD%BE%E9%BB%91%E5%AE%A2.png)
我正在将给定的代码改编为 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