我想定义一个具有相同名称但参数数量不同的命令。
我正在考虑这样的事情:
\documentclass{article}
\usepackage{hyperref}
\newcommand{\quelle}[1]{\textit{(Quelle: \url{#1})})}
\newcommand{\quelle}[2]{\textit{(Quelle: \url{#1} Absatz: #2)})}
\begin{document}
Test: \quelle{www.wikipedia.de}
Test: \quelle{www.wikipedia.de, sometext}
\end{document}
如果我尝试编译它,我会得到以下结果:
Command \quelle already defined. ...2]{\textit{(Quelle: \url{#1} Absatz: #2)})}
感谢您的帮助!
答案1
与请求的语法唯一的变化是使用 a!
作为 http 引用和“sometext”之间的分隔符,因为我认为逗号,
更有可能作为“sometext:”的一部分出现。
\documentclass{article}
\usepackage{hyperref,listofitems}
\newcommand{\quelle}[1]{%
\setsepchar{!}%
\readlist\qarg{#1}%
(\textit{Quelle: \url{\qarg[1]}}%
\ifnum\listlen\qarg[]>1\relax\textit{ Absatz: \qarg[2]}\fi%
)%
}
\begin{document}
Test: \quelle{www.wikipedia.de}
Test: \quelle{www.wikipedia.de! sometext}
\end{document}
答案2
我建议在最后添加一个可选参数,例如 withxparse
和\NewDocumentCommand
。
如果没有给出可选参数,则\quelle
其工作方式与预期的单参数版本相同,如果给出了可选参数,Absatz #2
则会另外打印。
可以使用 来检查是否已指定\IfValueT{#2}{}
。
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
%\newcommand{\quelle}[1]{\textit{(Quelle: \url{#1})})}
\NewDocumentCommand{\quelle}{m+o}{\textit{(Quelle: \url{#1}\IfValueT{#2}{Absatz: #2)}}}
\begin{document}
Test: \quelle{www.wikipedia.de}
Test: \quelle{www.wikipedia.de}[sometext]
\end{document}
答案3
我更喜欢带有前导可选参数的语法,这更符合常见的 LaTeX 约定。
无论如何,你可以通过定义来获得你喜欢的语法单个 \quelle
命令:TeX 不能对同一个命令有两种含义。
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
\NewDocumentCommand{\quelle}{ >{\SplitArgument{1}{,}}m }{%
\makequelle#1%
}
\NewDocumentCommand{\makequelle}{mm}{%
\textit{%
(Quelle: \url{#1}%
\IfValueT{#2}{ Absatz: #2})%
}%
}
\begin{document}
Test: \quelle{www.wikipedia.de}
Test: \quelle{www.wikipedia.de, sometext}
\end{document}
如果存在逗号,则参数在第一个逗号处拆分,并作为一对参数传递给\makequelle
。如果没有逗号,则第二个参数将使测试\IfValueT
为假,因此不会打印任何内容。
具有更常见语法的相同输出:
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
\NewDocumentCommand{\quelle}{om}{%
\textit{%
(Quelle: \url{#2}%
\IfValueT{#1}{ Absatz: #1})%
}%
}
\begin{document}
Test: \quelle{www.wikipedia.de}
Test: \quelle[sometext]{www.wikipedia.de}
\end{document}
答案4
以下代码提供了使用以下设置后所需的内容:
用于定义您将提供的
\quelleattributes{<list>}
前缀/属性名称(以逗号分隔) ( ,,...)。<list>
Quelle
Absatz
使用
etoolbox
,我们按顺序处理列表,先设置属性名称,然后设置属性。对每个属性名称进行文本比较,以查看其是否匹配Quelle
。仅有的这些是使用设置的\url
,而其他的则按原样设置。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{hyperref}
\newcounter{quellecnt}
\makeatletter
\newcommand{\quelleattributes}[1]{%
\setcounter{quellecnt}{0}% Restart counter
\renewcommand*{\do}[1]{% How to update each item
\stepcounter{quellecnt}% Step counter
\@namedef{quelle@\thequellecnt}{##1}% Define \quelle@<num> to attribute
}%
\docsvlist{#1}% Process list
}
\newcommand{\quelle}[1]{%
\setcounter{quellecnt}{0}% Restart counter
\renewcommand*{\do}[1]{%
\stepcounter{quellecnt}% Step counter
\let\quelleformat\relax% Default formatting of attribute
\ifnum\pdfstrcmp{\@nameuse{quelle@\thequellecnt}}{Quelle}=0
\def\quelleformat{\url}% Attribute should be a \url
\fi
\@nameuse{quelle@\thequellecnt}: \quelleformat{##1} % Set attribute
}
(\textit{%
\docsvlist{#1}\unskip% Process list
})%
}
\makeatother
\begin{document}
\quelleattributes{%
Quelle,
Absatz%
}
Test: \quelle{www.wikipedia.de}
Test: \quelle{www.wikipedia.de, sometext}
\end{document}