Bitte nur TeX-Antworten, die sich aus dem TeXbook ableiten lassen. Ich habe mir einen logischen Schalter erstellt, der es ermöglicht, in einem Befehl Anwendungsbereiche anzugeben. Je nach aktuellem Modus entscheidet der Befehl, ob er angewendet werden darf oder nicht. Kann man diesen logischen Schalter verbessern und wenn ja, wie?

Open in writeLaTeX
%texmodes
Anwendungsbereiche f\"ur Befehle definieren.\vskip\baselineskip
\newcount\texmodes
\def\texmode[#1]{\texmodes=#1}
\def\test{
\def\testbefehl{Ausf\"uhren }
\def\fehler{Nicht ausf\"uhrbar }
\ifnum\texmodes=0 \texmodes=0 \fi
\ifnum\texmodes=1 \texmodes=1 \fi
\ifnum\texmodes=2 \texmodes=1 \fi
\ifnum\texmodes=3 \texmodes=0 \fi
\ifnum\texmodes=4 \texmodes=0 \fi
\ifnum\texmodes=0 \testbefehl\vskip\baselineskip\else\fehler\vskip\baselineskip\fi
}
\texmode[0]
Mode=\the\texmodes
\test
\texmode[1]
Mode=\the\texmodes
\test
\texmode[2]
Mode=\the\texmodes
\test
\texmode[3]
Mode=\the\texmodes
\test
\texmode[4]
Mode=\the\texmodes
\test
%texmodes
\bye

gefragt 20 Sep '14, 00:09

ctansearch's gravatar image

ctansearch
(ausgesetzt)
Akzeptiert-Rate: 18%

bearbeitet 22 Sep '14, 10:51

gast3's gravatar image

gast3
(ausgesetzt)

\ifcase wäre hier viel kürzer.

(21 Sep '14, 07:01) Henri

Mit \ifcase statt vielen \ifnum.

Open in writeLaTeX
%texmodes
Anwendungsbereiche f\"ur Befehle definieren.\vskip\baselineskip
\newcount\texmodes
\def\texmode[#1]{\texmodes=#1}
\def\test{
  \def\testbefehl{Ausf\"uhren }
  \def\fehler{Nicht ausf\"uhrbar }
  \texmodes=\ifcase\texmodes 0\or 1\or 1\or 0\or 0\fi\relax
  \ifnum\texmodes=0
    \testbefehl\vskip\baselineskip
  \else
    \fehler\vskip\baselineskip
  \fi
}
\texmode[0]
Mode=\the\texmodes
\test
\texmode[1]
Mode=\the\texmodes
\test
\texmode[2]
Mode=\the\texmodes
\test
\texmode[3]
Mode=\the\texmodes
\test
\texmode[4]
Mode=\the\texmodes
\test
%texmodes
\bye

alt text

Permanenter link

beantwortet 21 Sep '14, 18:34

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

Falls man nicht möchte, dass \texmodes durch den Aufruf von \test verändert wird, weil man danach für einen anderen Zweck den ursprünglichen Modus noch benötigt, geht das auch:

Open in writeLaTeX
% texmodes
Anwendungsbereiche f\"ur Befehle definieren.\vskip\baselineskip
\newcount\texmodes
\def\texmode[#1]{\texmodes=#1}
\def\test{%
  \def\testbefehl{Ausf\"uhren }
  \def\fehler{Nicht ausf\"uhrbar }
  \ifodd\ifcase \texmodes 0 \or 1 \or 1 \or 0 \or 0 \or 1 \fi
    \testbefehl
  \else
    \fehler
  \fi
  \vskip\baselineskip
}
\texmode[0]
Mode=\the\texmodes
\test
\texmode[1]
Mode=\the\texmodes
\test
\texmode[2]
Mode=\the\texmodes
\test
\texmode[3]
Mode=\the\texmodes
\test
\texmode[4]
Mode=\the\texmodes
\test
%texmodes
\bye

Ich verwende in diesem Fall ein Leerzeichen an Stelle von \relax, um dem TeX-Parser das Ende der Zahl zu signalisieren. Das Leerzeichen wird von TeX dabei selbst aus dem Tokenstrom entfernt, da es gerade einen Zahltoken erstellt.

Permanenter link

beantwortet 22 Sep '14, 09:06

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 22 Sep '14, 09:06

Kurzinfo für die Theoretiker: Ich habe es so gelöst, daß ich innerhalb einer Gruppe am Anfang texmode=x (spezifische Gruppe), am Ende der Gruppe texmode=0 (allgemeine Gruppe) eingebe. Am Ende einer Gruppe wird immer der "offene" Modus 0 geschaltet. Es gibt also Umgebungen, (z.B Tabellen) die sich als Gruppe x definieren, und untergeordnete Befehle, z.B. Fußnoten) die sich als gruppenabhängig definieren. Ein Befehl, der nicht die Bedingung x erfüllt, kann in der Gruppe x nicht ausgeführt werden, in der Gruppe texmode=0 jederzeit. Ifcase (Gruppenmengen) ist noch nicht umgesetzt. Danke bis hier.

(23 Sep '14, 00:45) ctansearch

Forts. Dazu gibt es eine "failnotes"-Funktion, die am Ende jeder Gruppe anzeigt, welche Befehle nicht ausgeführt werden konnten, also am Ende von sections oder am Ende von Tabellen etc. Die Fehlermeldungen werden in der Ausgabedatei aufgeführt.

(23 Sep '14, 00:48) ctansearch
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:

×22
×14

gestellte Frage: 20 Sep '14, 00:09

Frage wurde gesehen: 9,777 Mal

zuletzt geändert: 23 Sep '14, 00:48