我想定义一个newcommand
带有两个可选参数的命令,它反过来调用另一个带有两个可选参数的命令。
类似以下内容(\B
调用\A
)。我该怎么做?
\newcommand{A}[3][][]{{#1 + #2 + #3}}
\newcommand{B}[3][][]{#1 + \A[#2][#3]{#1}}
\B{9}
\B[1][]{9}
\B[][3]{9}
\B[1][3]{9}
编辑
我试图给出类似的 MWE,但我担心上述示例实际上可能无法正确传达我的需要。
我之所以有这个问题,是为了创建一个命令,该命令接收某个 bib-item 并突出显示它。我想通过 newcommand向\parencite[pre][post]{#1}
(其中pre
和可以为空) 传递两个可选参数。然后该命令将突出显示参考文献。post
\hlcite[pre][post]{#1}
\hlcite
\usepackage{graphicx, color}
\usepackage[dvipsnames]{xcolor}
\usepackage{bookmark}
\usepackage[
backend=biber, % backend: biber
style=authoryear, % style: numeric-comp, authoryear
sorting=ynt, % sorting: none, ynt
]{biblatex}
\usepackage{soul}
\newcommand{\hlc}[2][yellow]{\sethlcolor{#1} \hl{#2}}
%% This works
\newcommand{\hlcite}[1]{\colorbox[green]{\mbox{\parencite{#1}}}}
%% But this throws error
\newcommand{\hlcite}[3]{\hlc[green]{\mbox{\parencite[#2][#3]{#1}}}}
参考
添加可选参数
- 如何在新命令中添加可选参数?
- 将空白作为参数传递给命令
- 如果未传递可选参数,则会出现特殊行为
- https://stackoverflow.com/questions/2144176/latex-newcommand-default-argument-is-empty
- https://stackoverflow.com/questions/1812214/latex-optional-arguments
- 新命令的可选参数?
- \newcommand 创建带有可选参数的命令
- 将可选参数传递给同样带有可选参数的命令
- 可选参数为空或根本没有提供可选参数?
- xparse:转发空的可选参数
- 在 newcommand 中传递 3 个可选参数
非 stackoverflow/stackexchange 链接:
在 Latex 中使用 if 条件:
\mbox
用于突出显示的参考资料\cite
或\parencite
内部参考资料\newcommand
。
答案1
您可以使用\NewDocumentCommand
。
\NewDocumentCommand{\hlc}{O{yellow}m}{\sethlcolor{#1}\hl{#2}}
\NewDocumentCommand{\hlcite}{oom}{%
\hlc[green]{%
\IfNoValueTF{#1}{% no optional argument
\parencite{#3}%
}{%
\IfNoValueTF{#2}{% just one optional argument
\parencite[#1]{#3}%
}{% both optional arguments
\parencite[#1][#2]{#3}%
}%
}%
}% end of \hlc
}
请注意,您不希望\sethlcolor{#1}
ad之间有空格\hl{#2}
。
答案2
也许是这样的?使用\newcommand
,如果希望吸收两个可选参数,则必须连续使用至少两个命令。
\documentclass{article}
\newcommand\A[1][0]{\def\Atmp{0#1}\Ahelp}
\newcommand\Ahelp[2][0]{\expandafter\Axhelp\expandafter{\Atmp}{0#1}{#2}}
\newcommand\Axhelp[3]{\the\numexpr#1 + #2 + #3\relax}
\newcommand\B[1][0]{\def\Btmp{0#1}\Bhelp}
\newcommand\Bhelp[2][0]{\expandafter\Bxhelp\expandafter{\Btmp}{0#1}{#2}}
\newcommand\Bxhelp[3]{\the\numexpr#1 + \Axhelp{#2}{#3}{#1}\relax}
\begin{document}
\B{9}
\B[1][]{9}
\B[][3]{9}
\B[1][3]{9}
\end{document}
该\B
命令可以更简单地实现
\NewDocumentCommand\B{ O{0} O{0} m }{\the\numexpr#1 + \Axhelp{0#2}{#3}{0#1}\relax}
然而,情况并非如此,\A
因为\Ahelp
在本例中是可扩展的,而\A
通过定义的\NewDocumentCommand
却不可扩展。