\ref{ }的第一个字符

\ref{ }的第一个字符

实际上,我想确定对标签的引用是否以 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并递归扩展括号组的内容,将无括号的结果留在输入流中。

假设这#1eq: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}

返回错误分支。

相关内容