答案1
尝试这个:
\documentclass{article}
\newcommand{\Titre}{Some text}
\begin{document}
Pre-Title \ifdefined \Titre\Titre{} \else\fi Post-Title
\end{document}
答案2
这看起来可能有点过头,但却可以将检查量降至最低。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\printoneortwo}{mm}
{
\seq_clear:N \l_tmpa_tl
\cs_if_exist:NT #1 { \seq_put_right:No \l_tmpa_tl { #1 } }
\cs_if_exist:NT #2 { \seq_put_right:No \l_tmpa_tl { #2 } }
\seq_use:Nn \l_tmpa_tl { ~ }
}
\ExplSyntaxOff
\newcommand{\Titre}{Some text}
\newcommand{\Date}{and then some}
\begin{document}
X\printoneortwo{\Titre}{\Date}X
X\printoneortwo{\foo}{\Date}X
X\printoneortwo{\Titre}{\foo}X
X\printoneortwo{\foo}{\baz}X
\end{document}
我们有条件地将项目添加到序列中,以使参数成为定义的控制序列;由于\seq_put:No
,参数将只扩展一次。
\seq_use:Nn
这样,我们得到了一个包含零个、一个或两个项目的序列。只有在最后一种情况下,执行时才会在项目之间添加空格。
如果没有expl3
我们能做到
\documentclass{article}
\makeatletter
\newcommand{\printoneortwo}[2]{%
\edef\@firstyes{\ifdefined#10\else1\fi}%
\edef\@secondyes{\ifdefined#20\else2\fi}%
\ifdefined#1#1\fi
\if\@firstyes\@secondyes\space\fi
\ifdefined#2#2\fi
}
\makeatother
\newcommand{\Titre}{Some text}
\newcommand{\Date}{and then some}
\begin{document}
X\printoneortwo{\Titre}{\Date}X
X\printoneortwo{\foo}{\Date}X
X\printoneortwo{\Titre}{\foo}X
X\printoneortwo{\foo}{\baz}X
\end{document}
\@firstyes
仅当和都为 0时才会添加空格\@secondyes
,而如果至少有一个控制序列未定义,则不会添加空格。
答案3
您可以在括号嵌套的宏参数内放置空格:
\documentclass{article}
\newcommand{\Titre}{Some text}
\newcommand{\Date}{some more text}
\newcommand\fot[2]{#1}% first of two
\newcommand\sot[2]{#2}% second of two
\begin{document}
\csname\ifdefined\Titre f\else s\fi ot\endcsname
{%
\Titre
\csname\ifdefined\Date f\else s\fi ot\endcsname
{ and \Date}% <- Both \Titre and \Date are defined.
{}% <- Only \Titre is defined.
. %
}{%
\csname\ifdefined\Date f\else s\fi ot\endcsname
{\expandafter\uppercase\Date. }% <- Only \Date is defined.
{}% <- Neither \Titre nor \Date is defined.
}%
\end{document}
这是否是更好的方法取决于你。