Wenn ich beide Pakete zusammen verwende erhalte ich folgende Fehlermeldung:

ERROR: Please use \mathaccent for accents in math mode.

--- TeX said ---
\add@accent ... \let \ignorespaces \relax \accent 
                                                  #1 #2\egroup \spacefactor ...l.11   \t1
           a*a + b*b

Hier ist ein Minimalbeispiel:

\documentclass[12pt,zed]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{zed-csp}
\usepackage[debug]{hyperref}
\begin{document}

\begin{zed}
  c*c = \\
  \t1 a*a + b*b
\end{zed}
\end{document}

Das Problem scheint mit \t1 zusammenzuhängen. Gibt es dafür eine Lösung?

gefragt 01 Nov, 12:35

dordow's gravatar image

dordow
8859
Akzeptiert-Rate: 0%

1

ich würde das nicht verwenden. Das Paket ist von 1995, und definiert haufenweise Befehle ohne irgendwelche Rücksicht auf existierende Definitionen zu nehmen.

(07 Nov, 15:57) Ulrike Fischer

Ich kenne das Paket zed-csp nicht. Aber in diesem Fall scheint es zu funktionieren, wenn man zed-csp nach hyperref lädt:

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[debug]{hyperref}
\usepackage{zed-csp}
\begin{document}

\begin{zed}
  c*c = \\
  \t1 a*a + b*b
\end{zed}
\end{document}

Der Fehler bei umgekehrter Reihenfolge deutet allerdings auf einen Konflikt hin, der ernst genommen werden sollte. Wahrscheinlich führt die gezeigte Vertauschung der Paketreienfolge zu einem anderen Problem. Potentielle Kandidaten für Probleme wären beispielsweise das Encoding von Bookmarks durch hyperref.

Eventuell ist die Umdefinierung eines Low-Level-Macros (das gilt eigentlich für alle Ein-Buchstaben-Makros) in zed-csp generell kritisch. Es handelt sich dabei nämlich bei LaTeX2e um ein Low-Level-Encoding-Macro. Dagegen macht zed-csp daraus offenbar so eine Art Tabulator. Eventuell sollte zed-csp hier zumindest für hyperref angepasst werden. Dies umso mehr als nicht dokumentiert ist, dass das ursprüngliche \t nach dem Laden des Pakets als \tie verfügbar ist. Auch wenn das Paket schon sehr alt ist, empfehle ich in jedem Fall einen Bug-Report. Eventuell kann der Paketautor wenigstens entsprechende Hinweise in die Anleitung aufnehmen.

Um die genannten Probleme zu entschärfen, wäre eventuell folgende Lösung vorzuziehen:

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{zed-csp}
\NewCommandCopy\ztab\t% Neue Bedeutung von \t in \ztab speichern.
\RenewCommandCopy\t\tie% Alte Bedeutung von \t wiederherstellen. (Braucht man nicht, wenn später hyperref geladen wird.)
\usepackage[debug]{hyperref}
\begin{document}

\begin{zed}
  c*c = \\
  \ztab1 a*a + b*b
\end{zed}
\end{document}

Hierbei wird die ursprüngliche Bedeutung von \t erhalten. Die zed-csp-Bedeutung von \t ist dagegen via \ztab verfügbar. Sollte eine ältere LaTeX-Version verwendet werden, die noch nicht über \NewCommandCopy und \RenewCommandCopy verfügt, so sind die beiden Anweisungen ggf. durch \let ersetzbar.

Um in der Umgebung zed trotzdem \t statt \ztab verwenden zu können, kann man den neuen Hook-Mechanismus von LaTeX ab Version 2020/10/01 verwenden:

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{zed-csp}
\NewCommandCopy\ztab\t% Neue Bedeutung von \t in \ztab speichern.
\RenewCommandCopy\t\tie% Alte Bedeutung von \t wiederherstellen. (Braucht man nicht, wenn später hyperref geladen wird.)
\AddToHook{env/zed/begin}[zed-csp]{\RenewCommandCopy\t\ztab}% Neue Bedeutung von \t am Anfang von zed reaktivieren.
\usepackage[debug]{hyperref}
\begin{document}

\begin{zed}
  c*c = \\
  \t1 a*a + b*b
\end{zed}
\end{document}

Ob das in jedem Fall funktioniert, kann ich nicht sagen, da – wie erwähnt – \t eine Low-Level-Anweisung aus der Font-Encoding-Verwaltung des LaTeX-Kerns ist.

Insgesamt macht das Paket auf mich den Eindruck, dass es eine eher unzureichende Anpassung eines LaTeX-2.09-Styles an LaTeX2e ist. Eventuell wäre es besser, sich ein anderes Paket für den Zweck zu suchen.

Die unbekannte Option zed, die vermutlich noch von der (gnadenlos veralteten) LaTeX-2.09-Syntax (Verwendung von \documentstyle) stammt, habe ich übrigens ebenso entfernt, wie das seit April 2018 überflüssig \usepackage[utf8]{inputenc}.

Es sei noch einmal explizit darauf hingewiesen, dass alle hier gezeigten Lösungsmöglichkeiten lediglich üble Hacks sind. Es sei auch darauf hingewiesen, dass das Problem eher genereller Natur ist, also nicht nur im Zusammenspiel mit hyperref Probleme auftreten können. LaTeX-Kernel-Anweisungen mit einer komplett abweichenden Bedeutung neu zu definieren, ist immer gefährlich. Am saubersten ist vermutlich die zweite Lösung. Das gilt auch, wenn hyperref nicht verwendet wird! Besser wäre jedoch, das Problem in zed-csp (und ggf. den davon abhängigen Tools) zu lösen, so dass \t gar nicht erst umdefiniert wird. Dazu sei als erster Schritt ein Bug-Report an den Autor empfohlen.

Permanenter link

beantwortet 01 Nov, 12:53

Ijon%20Tichy's gravatar image

Ijon Tichy
10.7k31733
Akzeptiert-Rate: 52%

bearbeitet 02 Nov, 09:13

Das Paket ist in der Tat für 2.09 geschrieben, ist aus den 90ern. Die Lösung mit der Umbenennung von \t auf \ztab funktioniert leider nicht, denn der Paketautor hat auch ein Tool für die Syntaxprüfung der Z-Spezifikationen geschrieben, das dann \ztab nicht erkennt und Fehlermeldungen ausgibt. Das Vertauschen der Paketeinbindungen hat aber funktioniert.

Vielen Dank für den Hinweis mit der Paketoption und inputenc.

(01 Nov, 15:31) dordow

@dordow: Falls es dich interessiert, warum ich deine Antwort in einen Kommentar umgewandelt habe.

Ansonsten sei nochmals darauf hingewiesen, dass die Umdefinierung von \t durchaus sehr kritisch sein kann. Wenn das \t mit der speziellen Bedeutung in der zed-Umgebung benötigt wird, sollte es zumindest auf diese Umgebung beschränkt werden, um das Risiko etwas zu vermindern. Ideal ist auch das nicht. Besser das Tool für die Syntaxprüfung anpassen.

(01 Nov, 16:04) Ijon Tichy

Ich vermute dass die Einschränkung der Umdefinition von \t auf die speziellen Umgebungen nur im Paket zed-csp vorgenommen werden können, nicht aber vom Paketanwender. Wenn ich die Erklärung richtig verstehe bedeutet das, dass auf Dauer auch Konflikte mit anderen Pakete möglich sind.

(01 Nov, 16:25) dordow

@dordow Ich habe die Antwort noch ein wenig erweitert, um sowohl die generelle Problematik noch einmal deutlich zu machen als auch einen Hack zu zeigen, bei dem \t in zed die Bedeutung von zed-csp wieder hat. Es gibt jedoch keinerlei Garantie von mir, dass das immer wie gewünscht funktioniert. Ich empfehle ausdrücklich, keine solchen Hacks zu verwenden.

(02 Nov, 09:15) Ijon Tichy

@dordow Das Paket wirft übrigens noch mehr Probleme auf. Beispielsweise wird ~ umdefiniert. Normalerweise ist ~ ein nicht umbrechbares Leerzeichen, für das explizit in den horizontalen Modus geschaltet wird (\nobreakspace). Dabei ist \nobreakspace inzwischen auch robust definiert, so dass es auch beim Schreiben in Dateien (beispielsweise toc, lof, lot etc.) funktioniert. Mit zed-csp ändert sich das. Weder ist es robust, noch wird in den horizontalen Modus umgeschaltet. Am Anfang eines Absatzes verhindert es also nun den Seitenumbruch vor dem Absatz. Das ist nicht gut.

(02 Nov, 09:25) Ijon Tichy

Ich habe mich einmal nach Alternativen umgeschaut, dem Paket und Tool ähnlich sind die Community Z Tools. Dort gibt es ebenfalls ein LaTeX Paket czt, welches aber ebenfalls \t als Tabulator definiert. Ich glaube, ich habe so etwas auch schon bei anderen Paketen gesehen. Es ist also die Frage, wie kritisch das Problem ist. Die nächste Frage ist, wie viele Fehler noch in dem Paket stecken. Gibt es denn eine Art Kodierrichtlinien für Pakete?

(07 Nov, 13:56) dordow

Im Fall von zed-csp müsste man das Paket und das Tool anpassen. Der Autor pflegt diese wohl nicht mehr, ich habe ihn in anderer Sache einmal kontaktiert.

(07 Nov, 13:57) dordow

@dordow Dass es immer kritisch zu sehen ist, wenn – zudem schlecht gepflegte – Pakete Kernel-Code umdefinieren, dürfte klar sein. Ich denke aus meiner Antwort und meinen Kommentaren geht auch hinreichend hervor, dass das Paket diesbezüglich reichlich problematisch zu sehen ist. Das Paket aus den Community Z Tools ist da leider nicht besser, das es entscheidende Teile, einfach aus zed-csp übernommen hat und aus den Kommentaren sogar hervorgeht, dass sie diesen Code nicht verstanden haben.

(07 Nov, 16:08) Ijon Tichy

@dordow Generell sollten Paketautoren \newcommand etc. gegenüber \def vorziehen. Damit wird verhindert, dass Befehle unbeabsichtigt überschrieben werden. Absichtliches Überschreiben sollte nur dann stattfinden, wenn es wirklich notwendig ist. Dabei sollte dann in der Regel beispielsweise mit \CheckCommand getestet werden, ob die vorhandenen Definition sich inzwischen geändert hat. Die Umdefinierungen von zed-cep basieren offenbar noch auf LaTeX 2.09. Das musste irgendwann schief gehen. Die Community Z Tools Leute kannst du gerne auf das Problem hinweisen. Die sollten sich Hilfe suchen.

(07 Nov, 16:13) Ijon Tichy
Ergebnis 5 von 9 show 4 more comments
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:

×59
×1

gestellte Frage: 01 Nov, 12:35

Frage wurde gesehen: 256 Mal

zuletzt geändert: 07 Nov, 16:13