调用名称依赖于宏的宏

调用名称依赖于宏的宏

抱歉,我实在找不到更好的标题。

我面临以下困境:我正在使用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}}}

无需任何其他代码。

相关内容