如何有条件地保持插入单词之间的正常间距

如何有条件地保持插入单词之间的正常间距

这是我的 MWE:

\documentclass{article}

\newcommand{\Titre}{Some text}
\newcommand{\Date}{and then some}

\begin{document}
        
    \ifdefined\Titre    \Titre    \else       \fi
    \ifdefined\Date     \Date     \else       \fi

\end{document}

                

显示:

在此处输入图片描述

您会看到文本没有空格。我看到我可以通过在定义中添加空格来安排它,\newcommand{\Date}{ and then some}但这不是最好的方法。你能找到更好的方法吗?

答案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}

这是否是更好的方法取决于你。

相关内容