实际上,我想确定对标签的引用是否以 1 开头。这个问题与匈牙利语有些关联。想法是使用xstring
包:
\documentclass{article}
\usepackage{xstring}
\usepackage{polyglossia}\setdefaultlanguage{hungarian}
\usepackage[hungarian]{hyperref}
\begin{document}
\begin{equation}
\label{eq:ab}
a=b
\end{equation}
The reference to the label \texttt{eq:ab},
which is actually \ref{eq:ab},
\IfBeginWith{\ref{eq:ab}}{1}{starts}{does not start} 1.
\end{document}
看起来输出\ref{eq:ab}
以一些奇特的字符开头,绝对不是 1。
我正在寻找使用lualatex
或 的解决方案xelatex
。即使我删除polyglossia
,使用pdflatex
也会生成与我预期不同的 pdf 文件。请不要使用babel
。感谢您的时间。
答案1
\ref
不适合检索数据,该命令很强大,并且 hyperref 还包含创建链接的代码。使用 refcount 包及其\getrefnumber
命令:
\documentclass{article}
\usepackage{xstring}
\usepackage{refcount} %loaded by hyperref
\begin{document}
\begin{equation}
\label{eq:ab}
a=b
\end{equation}
\begin{equation}
\label{eq:bb}
a=b
\end{equation}
The reference to the label \texttt{eq:ab},
which is actually \ref{eq:ab},
\IfBeginWith{\getrefnumber{eq:ab}}{1}{starts}{does not start} 1.
\IfBeginWith{\getrefnumber{eq:bb}}{1}{starts}{does not start} 1.
\end{document}
答案2
“无包”实现:
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\refstartswithoneTF}{mmm}
{% #1 = label, #2 = true text, #3 = false text
\mgy_ref_starts:nnn { #1 } { #2 } { #3 }
}
\cs_new:Nn \mgy_ref_number:n
{
\cs_if_exist:cTF { r@#1 }
{ \exp_last_unbraced:Nf \use_i:nn { \use:c { r@#1 } } }
{ 0 }
}
\cs_new:Nn \mgy_ref_starts:nnn
{
\str_if_eq:eeTF { \str_head:e { \mgy_ref_number:n { #1 } } } { 1 } { #2 } { #3 }
}
\cs_generate_variant:Nn \str_head:n { e }
\ExplSyntaxOff
\begin{document}
\begin{equation}
\label{eq:a}
a=b
\end{equation}
\begin{equation}
\label{eq:b}
a=b
\end{equation}
\setcounter{equation}{9}
\begin{equation}
\label{eq:c}
a=b
\end{equation}
The reference to the label \texttt{eq:a},
which is actually \ref{eq:a},
\refstartswithoneTF{eq:a}{starts}{does not start} with 1.
The reference to the label \texttt{eq:b},
which is actually \ref{eq:b},
\refstartswithoneTF{eq:b}{starts}{does not start} with 1.
The reference to the label \texttt{eq:c},
which is actually \ref{eq:c},
\refstartswithoneTF{eq:c}{starts}{does not start} with 1.
\end{document}
咒语是什么
\exp_last_unbraced:Nf \use_i:nn { \use:c { r@#1 } }
做?
第一条指令告诉 TeX 跳过下一个标记,即,\use_i:nn
并递归扩展括号组的内容,将无括号的结果留在输入流中。
假设这#1
是eq:c
为了举例。然后\use:c{r@eq:c}
首先产生\r@eq:c
(一个通常不能写的标记),然后展开。这种扩展总是具有以下形式
{<ref>}{<pageref>}
在本例中{10}{1}
。现在 TeX 将看到
\use_i:nn {10}{1}
这只会留10
在输入流中。这用于\mgy_ref_starts:nnn
。请注意\str_head:e
完全展开其参数,因此10
变为1
,我们最终得到
\str_if_eq:nnTF { 1 } { 1 } {starts} {does not start}
返回真正的分支。
我们eq:b
最终得到
\str_if_eq:nnTF { 2 } { 1 } {starts} {does not start}
返回错误分支。