Schließen Sie die Zeichenfolge ein, wenn die Variable definiert ist. Lassen Sie sie andernfalls leer.

Schließen Sie die Zeichenfolge ein, wenn die Variable definiert ist. Lassen Sie sie andernfalls leer.

Ich versuche, etwas abhängig davon erscheinen zu lassen, ob ein Argument angegeben wurde.

Am Anfang meines Dokuments möchte ich zwei Daten eingeben können

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

und sie dann in dieser Form erscheinen lassen

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

an verschiedenen Stellen im Dokument, wenn sie angegeben sind, und die Zeile völlig leer lassen, wenn nicht

Ich habe das Klassendokument wie folgt eingerichtet

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

Ich möchte den Dokumentkopf so definieren:

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

oder

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

abhängig davon, ob die Argumente idnum und epoxy angegeben sind

Gibt es für mich eine Möglichkeit, dies zu tun?

Antwort1

Initialisieren Sie es \@epoxyund \@idnumsetzen Sie es auf einen festen Wert. Definieren Sie dann ein \@print@epoxy@idnumMakro:

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

Antwort2

Sie müssen keine Bedingungen haben. Sie können einfach festlegen, dass die internen Makros nichts erzeugen, wenn nicht beide Befehle verwendet wurden. Hier erzeugen die Versionen 1 bis 3 also eine leere Zeile, aber 4 und 5 zeigen die beiden Begriffe.

Bildbeschreibung hier eingeben

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

Antwort3

Sie können für jede von ihnen Boolesche Bedingungen festlegen und diese dann bei der Zuweisung auf „true“ setzen. Wenn Sie immer entweder keine oder beide haben, reicht eine Bedingung aus. Hier werden die definierten Bedingungen geschrieben.

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

Bildbeschreibung hier eingeben


BEARBEITEN – Vereinfachung

Wenn Sie testen möchten, ob der Befehl definiert ist oder nicht, können Sie verwenden \@ifundefined. Um die Definitionen separat zu testen, können Sie meine vorherige Antwort wie folgt vereinfachen:

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

Wenn stattdessen beide so definiert werden sollen, dass sie irgendetwas schreiben, können die Bedingungen verschachtelt werden:

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

verwandte Informationen