Incluir string se a variável for definida, deixar em branco caso contrário

Incluir string se a variável for definida, deixar em branco caso contrário

Estou tentando fazer com que algo pareça condicional ao fato de um argumento ter sido apresentado.

No início do meu documento quero poder preencher dois dados

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

e então faça com que eles apareçam neste formato

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

em vários locais do documento, se forem fornecidos, e a linha estará totalmente em branco, caso contrário

Eu configurei o documento da turma assim

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

Quero definir o cabeçalho do documento como

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

ou

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

dependendo se os argumentos idnum e epóxi são fornecidos

Existe uma maneira de eu fazer isso?

Responder1

Inicialize \@epoxye \@idnumpara algo consertado; em seguida, defina uma \@print@epoxy@idnummacro:

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

Responder2

Você não precisa ter condicionais, basta fazer com que as macros internas não produzam nada, a menos que ambos os comandos tenham sido usados. Portanto, aqui as versões 1-3 produzem uma linha em branco, mas 4 e 5 mostram os dois termos.

insira a descrição da imagem aqui

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

Responder3

Você pode definir condições booleanas para cada uma delas e, em seguida, defini-las como verdadeiras na atribuição. Se você sempre não tiver nenhum ou ambos, basta uma condição. Aqui serão escritos os definidos.

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

insira a descrição da imagem aqui


EDITAR - Simplificação

Se você quiser testar se o comando está definido ou não você pode usar \@ifundefined. Para testar as definições separadamente você pode simplificar minha resposta anterior como:

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

Se, em vez disso, ambos devem ser definidos para escrever qualquer coisa, as condições podem ser aninhadas:

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

informação relacionada