Включите строку, если переменная определена, в противном случае оставьте пустым

Включите строку, если переменная определена, в противном случае оставьте пустым

Я пытаюсь сделать так, чтобы что-то выглядело обусловленным, если был приведен аргумент.

В начале моего документа я хочу иметь возможность заполнить два фрагмента данных

% 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

Вы можете задать булевы условия для каждого из них, а затем установить их истинными при назначении. Если у вас всегда есть либо none, либо оба, то достаточно одного условия. Здесь будут записаны определенные.

\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}

введите описание изображения здесь


EDIT -- Упрощение

Если вы хотите проверить, определена ли команда или нет, вы можете использовать \@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}}
}

Связанный контент