Seite 1 von 1

Numerische Behandlung von \StrLeft in eigener Umgebung

Verfasst: Do 13. Apr 2017, 00:05
von Rolli
Hallo liebe Community,
Ich verzweifele gerade mal wieder.

Ich bastele aktuell an einer eigene Umgebung für Multiple-Choice-Fragen. Den Antwortalternativen möchte ich eine 0 (für falsch) bzw. eine 1 (für richtig) voranstellen, also z.B. "0Wasser ist trocken" und "1Wasser ist nass".

Abhängig vom ersten Zeichen möchte ich dann in meiner Umgebung verzweigen, also z.B. in der Musterlösung bei 0 ein rotes Kästchen und bei 1 einen grünen Haken ausgeben.

Im Minimalbeispiel (unten) macht die erste \ifcase ... \fi - Struktur das, was ich möchte - da ist die 0 (bzw. 1) "hart" codiert.

Was ich aber brauche, ist die zweite \ifcase ... \fi - Struktur, welche per \StrLeft{...}{1} das linke Zeichen zurück gibt. Und das bringt einen Fehler.

Die xstring-Paketbeschreibung sagt dazu --- nullkommanichts ---.

Hilfe!!!
\documentclass[parskip=half]{scrartcl}
\usepackage{xstring}

\begin{document}
   \newcommand{\MCa}{0Diese erste Antwort a) ist falsch}
   \newcommand{\MCb}{1Diese zweite Antwort b) ist richtig}
   
   Falsch (0) / Wahr (1): \StrLeft{\MCa}{1} \\ % Ergibt korrekterweise 0
   Falsch (0) / Wahr (1): \StrLeft{\MCb}{1} \\ % Ergibt korrekterweise 1
   
   \ifcase 0 % Funktioniert für 0 bzw. 1 wie beabsichtigt
      FALSCH: \StrGobbleLeft{\MCa}{1}
   \or
      RICHTIG: \StrGobbleLeft{\MCa}{1}
   \fi
   
   \ifcase \StrLeft{\MCa}{1} % Ergibt einen Fehler =Missing number, treated as zero.=
      FALSCH: \StrGobbleLeft{\MCa}{1}
   \or
      RICHTIG: \StrGobbleLeft{\MCa}{1}
   \fi   
\end{document}
Wer kann helfen?

Gruß Rolli

Verfasst: Do 13. Apr 2017, 07:47
von Gast
Praktisch sämtliche Funktionen von xstring sind nicht voll expandierbar. Das bedeutet, dass \ifcase da keine Zahl zu sehen bekommt, sondern eine Abfolge von Makros, deren Ausgabe dann erst im Output die gewünschte Zeichen ergibt.

In Deinem Fall könntest Du einfach das erste Token aus der ersten Expansion von \MCa etc. abschneiden:
\documentclass[parskip=half]{scrartcl}
\usepackage{xstring}

\makeatletter
\newcommand*{\firsttokof}[1]{%
  \expandafter\@firsttokof #1\@nil
}
\newcommand*{\@firsttokof}{}
\def\@firsttokof#1#2\@nil{#1}
\makeatother

\begin{document}
   \newcommand{\MCa}{0Diese erste Antwort a) ist falsch}
   \newcommand{\MCb}{1Diese zweite Antwort b) ist richtig}
   
   Falsch (0) / Wahr (1): \StrLeft{\MCa}{1} \\ % Ergibt korrekterweise 0
   Falsch (0) / Wahr (1): \StrLeft{\MCb}{1} \\ % Ergibt korrekterweise 1
   
   \ifcase 0 % Funktioniert für 0 bzw. 1 wie beabsichtigt
      FALSCH: \StrGobbleLeft{\MCa}{1}
   \or
      RICHTIG: \StrGobbleLeft{\MCa}{1}
   \fi
   
   \expandafter\ifcase \firsttokof{\MCa}% Ergibt keinen Fehler =Missing number, treated as zero.=
      FALSCH: \StrGobbleLeft{\MCa}{1}
   \or
      RICHTIG: \StrGobbleLeft{\MCa}{1}
   \fi   

   \ifcase 1% Funktioniert für 0 bzw. 1 wie beabsichtigt
      FALSCH: \StrGobbleLeft{\MCb}{1}
   \or
      RICHTIG: \StrGobbleLeft{\MCb}{1}
   \fi
   
   \expandafter\ifcase \firsttokof{\MCb}% Ergibt keinen Fehler =Missing number, treated as zero.=
      FALSCH: \StrGobbleLeft{\MCb}{1}
   \or
      RICHTIG: \StrGobbleLeft{\MCb}{1}
   \fi   

\end{document}
Ohne das \expandafter in der Definition würde \ifcase das gesamte \MCa zu sehen bekommen. Das wäre zwar für die Entscheidung noch korrekt, würde dann aber im Fall von \MCa den Rest des Strings ausgeben.

In l3kernel sind übrigens weitergehende Funktionen zum Zerlegen von Tokenlisten und Strings enthalten. Wenn du also derartige Dingen machen willst, könnte es sinnvoll sein, sich damit näher zu beschäftigen.

Verfasst: Do 13. Apr 2017, 07:52
von Gast
Warum benutzt Du nicht einfach \IfBeginWith? Es sei auch noch darauf hingewiesen, dass es bereits fertige Pakete für multiple-choice und ähnliche Fragen und Antworten gibt.

Verfasst: Do 13. Apr 2017, 11:29
von u_fischer
Die expl3-Befehle sind eigentlich immer expandierbar
\documentclass[parskip=half]{scrartcl}
\usepackage{expl3}
\ExplSyntaxOn
 \newcommand\gethead{\tl_head:N}
 \newcommand\gettail  {\tl_tail:N}
\ExplSyntaxOff 
\begin{document}
   \newcommand{\MCa}{0Diese erste Antwort a) ist falsch}
   \newcommand{\MCb}{1Diese zweite Antwort b) ist richtig}

   Falsch (0) / Wahr (1): \gethead\MCa \\ % Ergibt korrekterweise 0
   Falsch (0) / Wahr (1): \gethead\MCb\\ % Ergibt korrekterweise 1
   

   \ifcase \gethead\MCa
      FALSCH: \gettail\MCa
   \or
      RICHTIG: \gettail\MCa
   \fi
\end{document} 

Verfasst: Di 18. Apr 2017, 11:19
von Rolli
Danke Euch!
Habe das Problem gelöst: Ich verwende jetzt eqexam. Das hat leider eine Reihe nicht dokumentierter Funktionen, um Texte in deutscher Sprache auszugeben, aber der Paketersteller Don Story hat mir sofort geantwortet.

Frage: Wie findet man solche Pakete?

Verfasst: Di 18. Apr 2017, 11:36
von Gast
Pakete finden geht über die Themen im CTAN-Katalog oder als fleißiger Leser der DTK durch die dortige Vorstellung neuer Pakete oder als fleißiger Leser der Mailingliste CTAN-ANN durch die dortigen Meldungen zu Updates und neuen Paketen oder durch fleißiges Lesen von LaTeX-Foren oder …