这个问题与我之前的一个问题相关增加参数和全局 xparse 宏的嵌套级别?
我使用修改后的版本\defsym
我使用了egreg 给出的这个答案回答上面的第二个问题。但是我遇到的问题是命名法定义有时会失败,因此缺少一些符号。对于 MWE 检查egreg 的回答以及下面的代码片段。
我既不明白它到底什么时候会失效,也想不出解决办法。当符号第一次使用时,似乎会发生这种情况,例如\phantom{\Ak}
或
\begin{align}
\Uk[j]
\end{align}
环境align
似乎探测了该行的长度,因此第一次使用是不可见的。这可以通过\typeout
在符号定义中使用 a 来看到,它将在日志中出现两次。
在后面插入上述代码片段之一\begin{document}
egreg 的 MWE导致符号从命名法中消失。
- 我想了解为什么
\nomenclature
不起作用,例如在以下毫无意义的例子中$\phantom{\nomenclature{$\alpha$}{Foo}}$
。我不明白为什么在此示例中将某些内容写入文件会失败。 - 当它失败时是否有某种系统?
- 如何修复?是否可以检查是否
\nomenclature
已成功将符号写入 nlo 文件?
答案1
这里的问题是对齐环境会对amsmath
材料进行两次传递,第一次是测量,第二次是进行实际排版。因此,在测量期间会评估进行注释并在第一次出现时将条件设置为 false 的代码,但这样创建的框会被直接丢弃。
的问题\phantom
类似:排版框被丢弃,\write
指令无法在垂直列表中“迁移”以便在正确的时间执行。简单地说,不要第一次将此类命令放在 中\phantom
。
对于amsmath
环境,我们必须与测量过程进行交互。
\documentclass{article}
\usepackage{xparse}
\usepackage{nomencl}
\usepackage{xcolor}
\usepackage{amsmath}
\makeatletter
\def\buergi@ifmeasuring#1#2{%
\ifmeasuring@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi{#1}{#2}}
\makeatother
% colorize to distinguish original and renewed command
\ExplSyntaxOn
% #1 = command name
% #2 = definition
% #3 = default optional argument
% #4 = description
\NewDocumentCommand{\defsym}{mmmm}
{
\bool_new:c { g_buergi_sym_ \cs_to_str:N #1 _bool }
\bool_gset_false:c { g_buergi_sym_ \cs_to_str:N #1 _bool }
\buergi_defsym:nnnn { #1 } { #2 } { #3 } { #4 }
}
\cs_new_protected:Npn \buergi_defsym:nnnn #1 #2 #3 #4
{
\NewDocumentCommand{#1}{O{#3}}
{
\buergi_ifmeasuring:nn
{ #2 }
{
\bool_if:cTF { g_buergi_sym_ \cs_to_str:N #1 _bool }
{ \textcolor{blue}{#2} }
{
\textcolor{red}{#2}
\nomenclature{$#1$}{#4}
\bool_gset_true:c { g_buergi_sym_ \cs_to_str:N #1 _bool }
}
}
}
}
\cs_set_eq:Nc \buergi_ifmeasuring:nn { buergi@ifmeasuring }
\ExplSyntaxOff
\defsym\Uk{U_{#1}}{k}{Some variable}
\defsym\Ak{A(#1)}{k}{Another}
\defsym\Bk{B(#1)}{k}{Test}
\makenomenclature
\begin{document}
\noindent $\Uk[j]$, $\Uk$, $\Uk[p]$, $\Uk[q]$ and $\Uk[r]$
\noindent $\Ak$, $\Ak[n]$
\begin{align}
\Bk[j]
\end{align}
\printnomenclature
\end{document}