Hey,

ich bin relativ neu bei LaTeX also bitte steinigt mich nicht für falschen Syntax.

Gibt es eine Möglich wie man die Anzahl der Zeichen im Argument eines Commands zählen kann? Ich bin Lehrer und versuche Lückentexte zu erstellen. Die Idee ist, dass ich schauen möchte, wie lange das Wort ist welches ich eingebe, um anschließend entsprechend viel Platz für Lückentexte zu lassen.

Beispiel

Öffne in Overleaf
\newcommand{\zähl}[1]{TOLLER CODE}
\newcommand{\lucke}[1]{\ifprintanswers [#1] \else \untenstrich{\zähl{#1}}

Keine Ahnung ob mein Pseudecode Sinn macht. Ich bin dankbar für jede Hilfe.

Mc_Muffin

gefragt 27 Mär '19, 18:49

Mc_Muffin's gravatar image

Mc_Muffin
1111
Akzeptiert-Rate: 0%

bearbeitet 27 Mär '19, 19:10

saputello's gravatar image

saputello
11.1k174365

1

Leerraum in der Größe eines bestimmten Textes geht ganz einfach per \hphantom{Leerraum statt Text}. Allerdings braucht man ja eigentlich zum händischen Ausfüllen meist etwas mehr Platz. Also eher mit \settowidth die Breite ermitteln und daraus dann einen Wert für eine Anzahl von Lückenelementen bestimmten.

Bevor Du allerdings alles selbst zu Fuß machst, sei darauf hingewiesen, dass es bereits diverse Pakete für Übungen und Prüfungen gibt.

(27 Mär '19, 19:09) saputello

BTW: Wenn Du wissen willst, wie ich die Formatierung Deines Beitrags angepasst habe, dann klick mal auf das große Fragezeichen in der Toolbar zum Antwortfeld unten. In der Anleitung zur Erstellung eines vollständigen Minimalbeispiels (was meist sinnvoller als irgendwelcher Pseudocode ist) ist ebenfalls erklärt, wie man Blockcode korrekt formatiert.

(27 Mär '19, 19:15) saputello

Was genau hast Du denn vor? Möchtest Du den Platz freihalten, den der Text bräuchte, wenn er mit TeX gesetzt würde? Oder möchtest Du die Zeichen zählen und Platz lassen, er proportional zur Anzahl der Buchstaben ist. (Das ist nicht ganz das Gleiche, da die Buchstaben in vielen Schriftarten unterschiedlich breit sind. In Monotype-Fonts sind sie alle gleich breit.) Es sei erwähnt, dass TeX mit Unterstreichungen und Unterstrichen so seine Probleme hat, es könnte z.B. komplexer werden, einen Zeilenumbruch zu erlauben.

(28 Mär '19, 10:34) moewe

Es sei erwähnt, dass man bei Lückentexten, der von SuS auszufüllen ist, vielleicht als Lehrer gut daran tut, die Lückengrößen etwas zu variieren und nicht proportional zum einzufügenden Text dimensionieren (man möchte ja nicht, dass die SuS nur Längen messen). In meiner Schulzeit hatte ich bei solchen Aufgaben auch immer Probleme, da meine Handschrift nicht nur hässlich sondern auch recht groß ist und so selten in die Lücken passte. Abmessen mit der von TeX gebrauchten Länge haut sicher für die wenigsten hin. Wenn es um "Aufdecktexte" auf dem Smartboard geht, sieht es vielleicht anders aus...

(28 Mär '19, 10:39) moewe

Wieder was gelernt: Lückentexte heißen auf Englisch wohl cloze und da gibt es ein LuaLaTeX-Paket für: https://ctan.org/pkg/cloze. xsim kann da auch etwas https://ctan.org/pkg/xsim (Kap. 15 der Anleitung). Siehe auch https://texwelt.de/wissen/fragen/20232/luckentext-mit-verschiedenen-versionen Bei TeX.SX findet sich ferner noch ein paar andere Fragen, z.B. https://tex.stackexchange.com/q/16003/35864, https://tex.stackexchange.com/q/165248/35864

(28 Mär '19, 11:12) moewe
3

@user49915 @chuck jeder ist dazu eingeladen, so viel beizutragen, wie er möchte. Allerdings (an user49915) ist das beantworten von Fragen erheblich vereinfacht, wenn man nicht raten muss, was passiert. Deshalb ist das Erstellen eines Minimalbeispiels wünschenswert. Wenn nun einige Nutzer bereit sind ohne dieses zu helfen, ist das deren Sache, andere Nutzer verlangen als Aufwand des Fragestellers ein Minimalbeispiel, bevor sie selbst den Aufwand betreiben. In den meisten Fällen ist ein Minimalbeispiel notwendig, manche Fragen können aber auch ohne eines beantwortet werden.

(28 Mär '19, 11:21) Skillmon

@user49915 und @chuck ich habe 3 off-topic Kommentare gelöscht, der Inhalt wurde ja auch schon gelesen und es gehört nicht zur Frage. Danke insbesondere @chuck und @Skillmon!

(28 Mär '19, 13:12) stefan ♦♦
Ergebnis 5 von 7 show 2 more comments

Das folgende zählt alle Token, die in seinem Argument genannt werden. Es benötigt exakt 2 Expansionen für sein Ergebnis. Es werden alle nicht gruppierten Token (inklusive Leerzeichen) gezählt. Vorkommende Gruppen werden als 1 Token gezählt. Makros werden nicht expandiert, sondern ebenfalls als 1 Token gezählt.

Öffne in Overleaf
\documentclass[]{article}

\makeatletter
% Spezielle Markierungen für Tests und um Argumente zu begrenzen
\newcommand*\my@mark{\my@mark}
\newcommand*\my@stop{\my@stop}
% Makro für das Verlassen von \if...\fi Konstrukten
\def\myfi@BTb\fi#1#2#3{\fi#2}
% Wandelt eine TeX \if-Abfrage in eine mit LaTeX-Syntax um
\newcommand\myiftestTF[1]
  {%
    #1%
    \myfi@BTb
    \fi
    \@secondoftwo
  }
% das Benutzermakro
\newcommand\counttoken[1]
  {%
    \the\numexpr0\counttoken@a #1 \my@mark\my@stop
  }
% Leerzeichen zählen
\def\counttoken@a #1 #2\my@stop
  {%
    % \my@mark markiert das Ende des Strings
    \myiftestTF{\ifx\my@mark#2}
      {\counttoken@b#1\my@stop}
      {+1\counttoken@a#1#2\my@stop}%
  }
% andere Token zählen
\newcommand\counttoken@b[1]
  {%
    % \my@stop markiert das Ende des Strings
    \myiftestTF{\ifx\my@stop#1}
      {\relax}
      {+1\counttoken@b}%
  }
\makeatother

\begin{document}
\counttoken{abc }
\end{document}

Allerdings halte ich, wie andere in den Kommentaren, das Freilassen aufgrund von Größe für besser geeignet. Gehen wir einfach mal davon aus, ein Mensch schreibt \Huge. Dann könnte man in etwa das Folgende verwenden:

Öffne in Overleaf
\documentclass[]{article}

\newsavebox\myspacebox
\newcommand*\leavespaceH[1]
  {%
    \sbox\myspacebox{\Huge#1}%
    \ifdim\wd\myspacebox>\linewidth
      \leavespaceV{#1}%
    \else
      \phantom{\usebox\myspacebox}%
    \fi
  }
\newcommand*\leavespaceV[2][\linewidth]{\phantom{\parbox[t]{#1}{\Huge#2}}}

% \fbox soll keinen zusätzlichen Platz verbrauchen, man könnte auch einen \fbox
% direkt in den beiden Macros verbauen
\setlength\fboxsep{-\fboxrule}

\begin{document}
\noindent
Denkst du das auch? \fbox{\leavespaceH{Nein, denke ich nicht}}\\
\fbox{\leavespaceV{Das kann gar nicht stimmen, denn durch den steigenden
Abgasgegendruck nimmt die Leistung des Motors ab}}
\end{document}
Permanenter link

beantwortet 28 Mär '19, 11:49

Skillmon's gravatar image

Skillmon
1.2k6
Akzeptiert-Rate: 46%

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×1

gestellte Frage: 27 Mär '19, 18:49

Frage wurde gesehen: 4,957 Mal

zuletzt geändert: 28 Mär '19, 13:13

verwandte Fragen