如何创建两个具有相同名称但参数数量不同的命令

如何创建两个具有相同名称但参数数量不同的命令

我想定义一个具有相同名称但参数数量不同的命令。

我正在考虑这样的事情:

\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

以下代码提供了使用以下设置后所需的内容:

  1. 用于定义您将提供的\quelleattributes{<list>}前缀/属性名称(以逗号分隔) ( ,,...)。<list>QuelleAbsatz

  2. 使用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}

相关内容