Numerische Behandlung von \StrLeft in eigener Umgebung

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Numerische Behandlung von \StrLeft in eigener Umgebung

von Gast » Di 18. Apr 2017, 11:36

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 …

von Rolli » Di 18. Apr 2017, 11:19

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?

von u_fischer » Do 13. Apr 2017, 11:29

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} 

von Gast » Do 13. Apr 2017, 07:52

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.

von Gast » Do 13. Apr 2017, 07:47

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.

Numerische Behandlung von \StrLeft in eigener Umgebung

von Rolli » Do 13. Apr 2017, 00:05

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

Nach oben