我需要测量通过命令从标签返回的字符串中的字符数\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 没有给出任何错误。我使用的是 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。