根据参数从命令内部生成的标签中删除空格

根据参数从命令内部生成的标签中删除空格

我有一个命令,它接受两个参数。在命令中,将插入一个子部分,该子部分也希望添加标签。问题是参数的单词之间可能有空格,因此在将它们分配给标签之前必须先删除它们。

MCE 如下所示:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}

\newcommand{\createPerson}[2]
{
    \subsection{#1}
    \label{#1#2}
    Use of the original #1 and #2 again.
}

\begin{document}
    \createPerson{Hans Viggo Jensen}{1956}

    See the reference \ref{HansViggoJensen1956}, \nameref{HansViggoJensen1956}.
\end{document}

答案1

别这么做,别这么做。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}

\makeatletter
\newcommand{\createPerson}[2]{%
  \subsection{#1}%
  \label{\zap@space#1 \@empty #2}%
  Use of the original #1 and #2 again.
}
\makeatother

\begin{document}

\createPerson{Hans Viggo Jensen}{1956}

See the reference \ref{HansViggoJensen1956}, \nameref{HansViggoJensen1956}.

\end{document}

但然后尝试一下

Preben Elkjær Larsen

你就会明白为什么你永远不应该这么做。

并且不,在参数中保留空格\ref并且未修改的代码也不会起作用。

标签应该只是简单的助记符。如果您的引用大多没有特殊字母,您可以通过添加可选参数来避免此问题:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xparse}
\usepackage{hyperref}

\ExplSyntaxOn

\tl_new:N \l_firefly_label_tl

\NewDocumentCommand{\createPerson}{omm}
 {
  \IfValueTF{#1}
   {% use the optional argument, if present
    \tl_set:Nn \l_firefly_label_tl { #1 #3 }
   }
   {% otherwise, strip spaces
    \tl_set:Nn \l_firefly_label_tl { #2 #3 }
    \tl_replace_all:Nnn \l_firefly_label_tl { ~ } { }
   }
  \subsection{#2}
  \label{\l_firefly_label_tl}
  Use ~ of ~ the ~ original ~ #2 ~ and ~ #3 ~ again.
}
\ExplSyntaxOff

\begin{document}

\createPerson{Hans Viggo Jensen}{1956}

See the reference \ref{HansViggoJensen1956}, \nameref{HansViggoJensen1956}.

\createPerson[PrebenElkiaerLarssen]{Preben Elkjær Larssen}{2015}

See the reference \ref{PrebenElkiaerLarssen2015}, \nameref{PrebenElkiaerLarssen2015}

\end{document}

我不太确定这会让您的打字更轻松,但您是最好的判断者。

在此处输入图片描述

相关内容