如何使用 \nameref 和 xstring 包来检查字符串长度

如何使用 \nameref 和 xstring 包来检查字符串长度

我需要测量通过命令从标签返回的字符串中的字符数\nameref

这是我的 MWE:

\documentclass{article}

\usepackage{hyperref}
\usepackage{xstring}

\begin{document}

\protected\def\testStr{\nameref{testLabel}}
String content = \testStr
\par

\newlength\testStrWidth
\settowidth{\testStrWidth}{\testStr}
String width = \the\testStrWidth
\par

\StrLen{\testStr}[\testStrNumOfChars]
Number of characters in string = \testStrNumOfChars

\clearpage

\makeatletter
\edef\@currentlabelname{This is a somewhat long string}
\label{testLabel}
\makeatother

Here we have some text to make another page.

\end{document}

结果如下:

MWE 结果

MWE 没有给出任何错误。我使用的是 XeTeX,但它在 pdfLaTeX 中也不起作用。我尝试过\edef\def\let不是\protected\def,但似乎都不起作用。

当然,如果我在\StrLen命令中明确设置测试字符串,一切都会正常工作。

任何帮助将非常感激。

答案1

\nameref命令需要完全扩展为文本形式。为此,您需要删除命令周围的超链接,因为正是超链接导致了问题。

以下略有不同egreg 的回答并使用 e-TeX 来判断参考文献的存在 - \r@<label>。我们感兴趣的只是提取名称/标题。仅此而已...

在此处输入图片描述

\documentclass{article}

\usepackage{hyperref,xstring}
\newcommand{\thirdoffive}[5]{#3}% Similar to \@thirdoffive
% \assignnameref{<ref>}{<macro>}
\newcommand{\assignnameref}[2]{%
  \gdef#2{}% Assign macro to be blank
  \ifcsname r@#1\endcsname % If the reference exists...
    \xdef#2{\expandafter\expandafter\expandafter\thirdoffive\csname r@#1\endcsname}% ...grab the third argument - the name/title
  \fi
}
\begin{document}

\assignnameref{testLabel}{\testStr}%
String content = \testStr
\par

\newlength\testStrWidth
\settowidth{\testStrWidth}{\testStr}%
String width = \the\testStrWidth
\par

\StrLen{\testStr}[\testStrNumOfChars]%
Number of characters in string = \testStrNumOfChars

\clearpage

\makeatletter
\edef\@currentlabelname{This is a somewhat long string}
\label{testLabel}
\makeatother

Here we have some text to make another page.

\end{document}

是的,文件\label中存在(via ).aux形式的宏。请参阅\r@<label>\newlabel了解引用和标签的工作原理

答案2

您需要一个可扩展的版本\nameref

\documentclass{article}

\usepackage{xstring}
\usepackage{hyperref}

\makeatletter
\newcommand{\getnamereftext}[1]{%
  \@ifundefined{r@#1}{}{%
    \unexpanded\expandafter\expandafter\expandafter{%
      \expandafter\expandafter\expandafter\@thirdoffive\csname r@#1\endcsname
    }%
  }%
}

\begin{document}

\StrLen{\getnamereftext{testLabel}}[\testStrNumOfChars]
Number of characters in string = \testStrNumOfChars

\makeatletter
\edef\@currentlabelname{This is a somewhat long string}
\label{testLabel}
\makeatother

\end{document}

当标签尚未定义时,这将返回 0。

在此处输入图片描述

相关内容