Numerische Behandlung von \StrLeft in eigener Umgebung

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Rolli
Forum-Guru
Forum-Guru
Beiträge: 382
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Numerische Behandlung von \StrLeft in eigener Umgebung

Beitrag 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

Gast

Beitrag 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.

Gast

Beitrag 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.

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4266
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

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

Rolli
Forum-Guru
Forum-Guru
Beiträge: 382
Registriert: Mi 15. Feb 2017, 08:50
Wohnort: Mittelfranken

Beitrag 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?

Gast

Beitrag 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 …

Antworten