抱歉,我实在找不到更好的标题。
我面临以下困境:我正在使用smartref
包裹,特别是我正在使用它的\sgetXval
宏。事实上,我正在使用我之前的问题确定标签是否指向(比如说)某个部分或某个章节,然后我想相应地调用其中一个\sgetsectionval
或两个\sgetchapterval
。
我尝试过:
\csname sget\getreftype{#1}val\endcsname{\target@counter}{#1}
但我Missing \endcsname inserted
系统地得到了错误。
底线:我想要一种方式构建来自任意表达式的宏名,然后调用所述构造的宏名。
我可以发布更多代码,但它会变得混乱,我认为这足以正确传达问题,否则请告诉我:)
編輯:MNWE;)
\documentclass{article}
\usepackage{hyperref}
\usepackage{smartref}
\addtoreflist{section}
\makeatletter
\newcounter{actual@counter}% Additional chapter counter
% Helper macro to extract the type (section,subsection...) or the type name
% out of the label reference. Works with hyperref only.
% Argument #1 is a macro of form \def\...#1...\@nil{...}
% Argument #2 is the label reference, e.g. "sect:test"
\newcommand*\@getautoref[2]{% \HyPsd@@@autoref from hyperref, modified
\expandafter\ifx\csname r@#2\endcsname\relax
??%
\else
\expandafter\expandafter\expandafter\@@getautoref
\csname r@#2\endcsname{}{}{}{}\@nil#1\@nil
\fi
}
\def\@@getautoref#1#2#3#4#5\@nil#6\@nil{%
#6#4.\@nil}% Argument #4 = type and number, e.g. "section.1" or "subsection.1.2"
% \getreftype results in the type name, e.g. "section" or "figure".
% It remove a star, if existent, i.e. "section*" will become "section"
\newcommand\getreftype{%
\@getautoref\@@getreftype}
\def\@getreftype#1.#2\@nil{#1}
\def\@@getreftype#1.#2\@nil{\@@@getreftype#1*\@nil}
\def\@@@getreftype#1*#2\@nil{#1}
% \getautorefname results in the type prose name (plus space character),
% e.g. "section" in English or "Abschnitt" in German
% (like \autoref, but without number).
% Since the \space is hard coded inside \HyPsd@@autorefname we use our
% own version called \@getautorefname instead.
% It will work with labels to \section* etc., too.
\newcommand*\getautorefname{%
\@getautoref\@@getautorefname}
\def\@getautorefname#1.#2\@nil{\@@@getautorefname{#1}}
\def\@@getautorefname#1.#2\@nil{%
\expandafter\@@@getautorefname\expandafter{\@@@getreftype#1*\@nil}}
\def\@@@getautorefname#1{% = \HyPsd@@autorefname without \space
\ltx@IfUndefined{#1autorefname}%
{\ltx@IfUndefined{#1name}{}{\csname#1name\endcsname}}%
{\csname#1autorefname\endcsname}}
\makeatother
\newcommand{\getrefval}[2]{%
\csname sget\getreftype{#1}val\endcsname{#2}{#1}% Retrieve chapter counter from reference
}
\begin{document}
\section{An example section\label{sec:anExampleSection}}
\section{Another example section\label{sec:anotherExampleSection}}
\getrefval{sec:anExampleSection}{\csOne}
\getrefval{sec:anotherExampleSection}{\csTwo}
% here, \csOne should contain "1" and \csTwo should contain "2"
\end{document}
(这是链接问题中代码的稍微修改后的版本,我不需要在其中定义带星号和不带星号版本的宏的额外灵活性,所以我只是删除了相应的代码)。
当我尝试使用时出现错误\getrefval
。
答案1
如果按以下顺序加载包
\usepackage{hyperref}
\usepackage{smartref}
然后代码就会执行预期的操作。然而定义应该是
\newcommand{\getrefval}[2]{%
\csname sget\getreftype{#1}val\endcsname{#2}{#1}% Retrieve chapter counter from reference
}
没有您所放置的空格。
而且,\addtoreflist{section}
还得发行。
但是,通过加载引用计数包裹:
\usepackage{refcount}
\newcommand{\getrefval}[2]{%
\edef#2{\getrefnumber{#1}}}
无需任何其他代码。