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 \@epoxy
e \@idnum
para algo consertado; em seguida, defina uma \@print@epoxy@idnum
macro:
\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.
\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}
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}}
}