Incluir cadena si se define la variable, dejar en blanco en caso contrario

Incluir cadena si se define la variable, dejar en blanco en caso contrario

Estoy tratando de que algo parezca condicional a si se dio un argumento.

Al comienzo de mi documento quiero poder completar dos datos

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

y luego hacer que aparezcan en este formulario

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

en varios lugares del documento si se dan y que la línea esté totalmente en blanco si no

He configurado el documento de clase así

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

Quiero definir el encabezado del documento para que sea

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

o

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

dependiendo de si se dan los argumentos idnum y epoxy

¿Hay alguna manera de hacer esto?

Respuesta1

Inicializar \@epoxyy \@idnuma algo arreglado; luego define una \@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)}%
  }%
}

Respuesta2

No es necesario tener condicionales; simplemente puede organizar que las macros internas no produzcan nada a menos que se hayan utilizado ambos comandos. Entonces, aquí las versiones 1 a 3 producen una línea en blanco, pero la 4 y la 5 muestran los dos términos.

ingrese la descripción de la imagen aquí

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

Respuesta3

Puede establecer condiciones booleanas para cada uno de ellos y luego establecerlas como verdaderas en la asignación. Si siempre tienes ninguno o ambos, es suficiente con una condición. Aquí se escribirán los 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}

ingrese la descripción de la imagen aquí


EDITAR - Simplificación

Si desea probar si el comando está definido o no, puede utilizar \@ifundefined. Para probar las definiciones por separado, puedes simplificar mi respuesta 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}

Si, por el contrario, ambos deben definirse para escribir cualquier cosa, las condiciones se pueden anidar:

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

información relacionada