如果定義了變量,則包含字串,否則留空

如果定義了變量,則包含字串,否則留空

我試著讓一些東西看起來有條件,如果給出一個論點。

在我的文檔的開頭我希望能夠填寫兩個數據

% Pre or Post epoxy?
\epoxy{pre}
% Checklist ID number
\idnum{123456}

然後讓它們以這種形式出現

(\@epoxy-epoxy -- \@idnum)

如果給出了,則在文件的各個位置,如果沒有給出,則該行完全空白

我已經像這樣設定了類文檔

\def\epoxy#1{\gdef\@epoxy{#1}}
\def\idnum#1{\gdef\@idnum{#1}}

我想將文檔標題定義為

\AtBeginDocument {\listtitle \newline (\@epoxy-epoxy -- \@idnum) \newline \header \begin{checklist}}

或者

\AtBeginDocument {\listtitle \newline \newline \header \begin{checklist}}

取決於是否給 idnum 和 Epoxy 參數

我有辦法做到這一點嗎?

答案1

初始化\@epoxy\@idnum固定一些東西;然後定義一個\@print@epoxy@idnum巨集:

\let\@epoxy\hfuzz % initialize
\let\@idnum\vfuzz % initialize
\def\epoxy#1{\gdef\@epoxy{#1}}
\def\idnum#1{\gdef\@idnum{#1}}
\def\@print@epoxy@idnum{%
  \ifx\@epoxy\hfuzz
    \expandafter\@gobble
  \else
    \expandafter\@firstofone
  \fi
  {\ifx\@idnum\vfuzz
     \expandafter\@firstoftwo
   \else
     \expandafter\@secondoftwo
   \fi
   {\mbox{}}{(\@epoxy--epoxy -- \@idnum)}%
  }%
}

答案2

您不必有條件,您可以安排內部巨集不產生任何內容,除非兩個命令都已使用。因此,這裡版本 1-3 會產生一個空白行,但版本 4 和 5 顯示這兩個術語。

在此輸入影像描述

\documentclass{article}

\def\inittitle{%
\def\stuff{\mbox{}}%
\def\xidnum##1{}%
\def\epoxy##1{\def\stuff{\xidnum{##1-epoxy -- }}}%
\def\idnum##1{\def\xidnum####1{####1##1}}%
}


\setlength\parskip{20pt}


\begin{document}

\inittitle
1title \newline \stuff  \newline zzz


\inittitle
\epoxy{pre}
2title \newline \stuff  \newline zzz


\inittitle
\idnum{123456}
3title \newline \stuff  \newline zzz



\inittitle
\epoxy{pre}
\idnum{123456}
4title \newline \stuff  \newline zzz


\inittitle
\idnum{123456}
\epoxy{pre}
5title \newline \stuff  \newline zzz

\end{document}

答案3

您可以為每個條件設定布林條件,然後在賦值時將它們設為 true。如果你總是沒有或兩者兼而有之,那麼有一個條件就足夠了。這裡將寫入定義的內容。

\documentclass{article}
\newif\ifepoxy\epoxyfalse
\newif\ifidnum\idnumfalse
\makeatletter
\def\epoxy#1{\gdef\@epoxy{#1}\epoxytrue}
\def\idnum#1{\gdef\@idnum{#1}\idnumtrue}
\def\writeStuff{%
  \ifepoxy
  \@epoxy-epoxy
  \fi
  \ifidnum
  -- \@idnum
  \fi}
\makeatother
\begin{document}
Test1: \writeStuff

\epoxy{pre}
Test2: \writeStuff

\idnum{123456}
Test3: \writeStuff

\end{document}

在此輸入影像描述


編輯——簡化

如果您想測試命令是否已定義,可以使用\@ifundefined.要單獨測試定義,您可以將我之前的答案簡化為:

\documentclass{article}
\makeatletter
\def\epoxy#1{\gdef\@epoxy{#1}}
\def\idnum#1{\gdef\@idnum{#1}}
\def\writeStuffII{%
  \@ifundefined{@epoxy}{}{\@epoxy-epoxy}%
  \@ifundefined{@idnum}{}{ -- \@idnum}
}
\makeatother
\begin{document}

相反,如果兩者都應定義為寫入任何內容,則可以嵌套條件:

\def\writeStuffIII{%
  \@ifundefined{@epoxy}{}{%
    \@ifundefined{@idnum}{}{\@epoxy-epoxy -- \@idnum}}
}

相關內容