我想创建一个与原始命令非常相似的引用命令:
\newcommand{\mycite}[2][]{\hspace{30pt}\cite{#2}{#1}}
问题是,当我只写\mycite{test}
。那么就会有
[测试, ]
但它应该是
[测试]
因为我省略了可选参数。我尝试使用包xparse
。但是使用以下代码我得到了相同的结果
\NewDocumentCommand\mycite{O{}m}{%
\cite[#1]{#2}%
}
我做错了什么?你能帮助我吗?
答案1
没有检查 的可选参数是否\mycite
存在。因此\mycite{#2}
仍将使用 的\cite[]{#2}
空可选参数进行调用\cite
,这意味着,
在列表中进行排版。
我添加了“传统”方法来检查可选参数和xparse
方法(更容易!)
笔记:参考书目相关软件包可能已经更改了\cite
命令。本文不涉及此内容。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{xparse}
\makeatletter
\newcommand{\@myotherciteopt}[2][]{%
\hspace{30pt}%
\ifblank{#1}{%
\cite{#2}%
}{%
\cite[#1]{#2}%
}%
}
\newcommand{\@myothercitenoopt}[1]{%
\@myotherciteopt[]{#1}%
}
\newcommand{\myothercite}{%
\@ifnextchar[{\@myotherciteopt}{\@myothercitenoopt}%
}
\makeatother
\NewDocumentCommand\mycite{om}{%
\hspace{30pt}%
\IfValueTF{#1}{%
\cite[#1]{#2}%
}{%
\cite{#2}%
}%
}
\begin{document}
\mycite{Lam94}
\myothercite{Lam94}
Now with options:
\mycite[Ms. Ann Elk]{Lam94}
\myothercite[Ms. Ann Elk]{Lam94}
\bibliographystyle{alpha}
\bibliography{biblio}
\end{document}