Der Zähler wird innerhalb von \if erhöht, auch wenn die Bedingung nicht erfüllt ist

Der Zähler wird innerhalb von \if erhöht, auch wenn die Bedingung nicht erfüllt ist

Ich habe drei Zähler definiert, die ich innerhalb einer Bedingung hochzählen werde. Das soll dazu führen, dass funktionale Anforderungen mit FA (und einer nachfolgenden Nummer) und nicht funktionale Anforderungen mit NFA (und einer von den funktionalen Anforderungen unabhängigen Nummernfolge) beginnen. Das soll auch für die allgemeine User Story gelten.

Mit dem unten stehenden Code scheint der Zähler unabhängig davon weiterzugehen, ob die Bedingung erfüllt ist oder nicht. Leider bin ich mir nicht ganz sicher, ob es eine bessere Lösung gibt oder ob ich etwas falsch mache. Kommentare sind sehr willkommen!

\documentclass[11pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[scaled]{helvet}
\usepackage[T1]{fontenc}
\usepackage[left=4cm, right=2cm, top=4cm, bottom=2cm]{geometry}
\usepackage[style=long,nonumberlist,toc,acronym]{glossaries}


\newacronym{U}{U}{User Story(s)}
\newacronym{FA}{FA}{Funktionale Anforderung}
\newacronym{NFA}{NFA}{Nicht funktionale Anforderung}

\newcounter{UserStoryCounter}
\setcounter{UserStoryCounter}{1}

\newcounter{UserStoryCounterFA}
\setcounter{UserStoryCounterFA}{1}

\newcounter{UserStoryCounterNFA}
\setcounter{UserStoryCounterNFA}{1}

\newcommand{\userstory}[3]{
    \if\equal{#1}{\string FA}
        \paragraph{(#1\gls{FA}\arabic{UserStoryCounterFA}) #2}#3
        \stepcounter{UserStoryCounterFA}
    \else
        \if\equal{#1}{NFA}
            \paragraph{(#1\gls{NFA}\arabic{UserStoryCounterNFA}) #2}#3
            \stepcounter{UserStoryCounterNFA}
        \else
            \paragraph{(#1\gls{U}\arabic{UserStoryCounter}) #2}#3
            \stepcounter{UserStoryCounter}
        \fi
    \fi
}
\begin{document}

\userstory{FA}{}{}
\userstory{NFA}{}{}
\userstory{U}{}{}

\end{document}

Antwort1

Das Beispiel erzeugt den Fehler

! Undefined control sequence.
\userstory #1#2#3-> \if \equal 

as \equalist nicht definiert. Wenn \equaldefiniert wurde, \if\equal{würde es expandieren \equalund dann prüfen, ob die ersten beiden Token in seiner Expansion das gleiche Zeichen wären, oder wenn seine Expansion nur ein Token wäre, würde es prüfen, ob das ist{

Sie könnten ersetzen

\if\equal{#1}{\string FA}

durch beispielsweise

\def\tmpa{#1}\def\tmpb{FA}\ifx\tmpa\tmpb

Antwort2

In TeX gibt es kein \equal, es sei denn, Sie definieren es. Hier ist eine viel einfachere Methode, Ihren Befehl zu definieren.

\documentclass[11pt,a4paper]{article}
%\usepackage[utf8]{inputenc} % no longer needed
\usepackage[scaled]{helvet}
\usepackage[T1]{fontenc}
\usepackage[left=4cm, right=2cm, top=4cm, bottom=2cm]{geometry}
\usepackage[style=long,nonumberlist,toc,acronym]{glossaries}


\newacronym{U}{U}{User Story(s)}
\newacronym{FA}{FA}{Funktionale Anforderung}
\newacronym{NFA}{NFA}{Nicht funktionale Anforderung}

\newcounter{UserStoryCounter}
\setcounter{UserStoryCounter}{1}

\newcounter{UserStoryCounterFA}
\setcounter{UserStoryCounterFA}{1}

\newcounter{UserStoryCounterNFA}
\setcounter{UserStoryCounterNFA}{1}

\ExplSyntaxOn

\NewDocumentCommand{\userstory}{mmm}
 {
  \str_case:nnF {#1}
   {
    {FA}{
     \paragraph{(#1\gls{FA}\arabic{UserStoryCounterFA})~#2}#3
     \stepcounter{UserStoryCounterFA}
    }
    {NFA}{
      \paragraph{(#1\gls{NFA}\arabic{UserStoryCounterNFA})~#2}#3
      \stepcounter{UserStoryCounterNFA}
    }
    %add other cases here
   }
   {% all other cases
    \paragraph{(#1\gls{U}\arabic{UserStoryCounter})~#2}#3
    \stepcounter{UserStoryCounter}
   }
 }
\ExplSyntaxOff

\begin{document}

\userstory{FA}{}{}

\userstory{NFA}{}{}

\userstory{U}{}{}

\end{document}

Dies lässt sich in gleicher Weise problemlos auf mehr als zwei Fälle ausweiten.

Bildbeschreibung hier eingeben

verwandte Informationen