使用 xstring 和 \Makelowercase 生成标签

使用 xstring 和 \Makelowercase 生成标签

我正在尝试编写一个命令,使我能够引用带有生成标签的子部分。

我的想法是,当我声明一个步骤时\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}

相关内容