![根据参数从命令内部生成的标签中删除空格](https://linux22.com/image/318960/%E6%A0%B9%E6%8D%AE%E5%8F%82%E6%95%B0%E4%BB%8E%E5%91%BD%E4%BB%A4%E5%86%85%E9%83%A8%E7%94%9F%E6%88%90%E7%9A%84%E6%A0%87%E7%AD%BE%E4%B8%AD%E5%88%A0%E9%99%A4%E7%A9%BA%E6%A0%BC.png)
我有一个命令,它接受两个参数。在命令中,将插入一个子部分,该子部分也希望添加标签。问题是参数的单词之间可能有空格,因此在将它们分配给标签之前必须先删除它们。
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}
我不太确定这会让您的打字更轻松,但您是最好的判断者。