我正在尝试编写一个命令,使我能够引用带有生成标签的子部分。
我的想法是,当我声明一个步骤时\step{Long Name With Many Uppercase Letters}
,生成的标签将是 \label{step:long_name_with_many_uppercase_letters}。
我已经找到了根据宏参数生成标签,但我担心基于使用的答案\@firstofone
对我的情况不起作用。
我目前的方法如下:
\makeatletter
% Step command
\newcounter{step}[section]
\setcounter{step}{0}
\newcommand{\step}[1]{%
\subsection{#1}
\refstepcounter{step}
\label{step:\MakeLowercase{\StrSubstitute[0]{#1}{ }{\_}}}
}
\makeatother
不幸的是,将标签命令与其他命令一起使用会出现以下错误:
Missing \endcsname inserted \step{First Step}
TeX capacity exceeded, sorry [input stack size=5000] \step{First Step}
如果我删除该\label
命令,它就会起作用(但当然会给我有关未定义引用的警告)。
一个简单的例子如下:
\documentclass{scrbook}
\usepackage{xstring}
\makeatletter
% Step command
\newcounter{stepctr}[section]
\setcounter{stepctr}{0}
\newcommand{\step}[1]{%
\subsection{#1}
\refstepcounter{stepctr}
\label{step:\MakeLowercase{\StrSubstitute[0]{#1}{ }{\_}}}
}
\makeatother
\begin{document}
\chapter{My only chapter}
\section{A section where I reference steps}
I'd like to reference step number \ref{step:first_step} and \ref{step:third_step} here.
\section{A section where I define steps}
\step{First Step}
Foo.
\step{Second Step}
Bar.
\step{Third Step}
Whatever.
\end{document}
答案1
您希望将标签的参数改为小写,而不是\label
在其参数中包含小写命令,因此请反转表达式的顺序:
\documentclass{scrbook}
\usepackage{xstring}
% Step command
\newcounter{stepctr}[section]
\setcounter{stepctr}{0}
\newcommand{\step}[1]{%
\subsection{#1} %
\refstepcounter{stepctr}%
{\lccode`\ `\_\lowercase{\label{step:#1}}}}
\begin{document}
\chapter{My only chapter}
\section{A section where I reference steps}
I'd like to reference step number \ref{step:first_step} and \ref{step:third_step} here.
\section{A section where I define steps}
\step{First Step}
Foo.
\step{Second Step}
Bar.
\step{Third Step}
Whatever.
\end{document}