xelatex freeze mit Paketen mhchem, ulem, fontspec

Alles rund um das System für Linux, Mac & Windows.


Gast

xelatex freeze mit Paketen mhchem, ulem, fontspec

Beitrag von Gast »

Hallo Forum,

Bei folgendem Minimalbeispiel bleibt xelatex texlive2013 bei dieser als letzter Meldung stehen, bzw. friert ohne Fehler ein. Ein Beenden ist soweit mit Strg-c, \end, x möglich.
) (/usr/local/texlive/2013/texmf-dist/tex/latex/tipa/t3cmr.fd)
\documentclass{article}
\usepackage[version=3]{mhchem}
\usepackage[normalem]{ulem}
\usepackage{fontspec}
% oder xltxtra laden
\begin{document}
\[ 2+2=5 \]
\end{document}
Dies betrifft nur diese Form des Mathemodus' und wird eines der 3 Pakete nicht geladen, funktioniert der Durchlauf ebenso. Das tl2013 vanilla läuft auf einem Ubuntu 12.04.[/code]

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

Beitrag von u_fischer »

Das ist m.E. ein Bug in ulem.sty. Es benutzt
\expandafter\ifx \csname @ifundefined\endcsname \relax
Das setzt @ifundefined zu \relax und bringt die nachfolgenden Pakete durcheinander.

Wenn man die Zeile ersetzt durch
\ifcsname @ifundefined\endcsname 
geht es wieder. Mach einen Bugreport.

Gast

Beitrag von Gast »

Funktioniert bei mir leider nicht:
(/usr/local/texlive/2013/texmf-dist/tex/generic/ulem/ulem.sty
! Undefined control sequence.
\ds@normalem ->\normalem 
                         
l.322   \AtBeginDocument
                        {\let\UL@marginpar\marginpar}%
Ist es so, dass der ulem.sty code schaut, ob @ifundefined definiert ist und wenn nicht, definiert es diesen mit \relax? Ich verstehe nicht, weshalb das \relax ausdrücklich dahinter steht. Die Doku sagt, steht dort nichts, wird \relax als Wert gesetzt.

Dein code macht das gleiche mit dem Unterschied, dass \ifcsname ein undefiniertes @undefined nach dem check nicht definiert?[/code]

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

Beitrag von u_fischer »

Es war auch quatsch. Das Problem ist die \MakeRobust-Definition von ulem.sty. Sie verhindert, dass später die Definition von fixltx2e benutzt wird.

Füge das hier ein:
\usepackage[normalem]{ulem}
\makeatletter
\renewcommand*\MakeRobust[1]{%
  \@ifundefined{\expandafter\@gobble\string#1}{%
    \@latex@error{The control sequence `\string#1' is undefined!%
      \MessageBreak There is nothing here to make robust}%
    \@eha
  }%
  {%
    \@ifundefined{\expandafter\@gobble\string#1\space}%
    {%
      \expandafter\let\csname
      \expandafter\@gobble\string#1\space\endcsname=#1%
      \edef\reserved@a{\string#1}%
      \def\reserved@b{#1}%
      \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}%
      \edef#1{%
        \ifx\reserved@a\reserved@b
          \noexpand\x@protect\noexpand#1%
        \fi
        \noexpand\protect\expandafter\noexpand
        \csname\expandafter\@gobble\string#1\space\endcsname}%
    }%
    {\@latex@info{The control sequence `\string#1' is already robust}}%
   }%
}
\makeatother

Besserwisser

Beitrag von Besserwisser »

Nein, das macht nicht das gleiche. Bei
\expandafter\ifx\csname @ifundefined\endcsname\relax
wird \@ifundefined durch \csname @ifundefined\endcsname zu \relax, falls es vorher nicht definiert war. Falls es definiert war, bleibt es unverändert. Dann wird dieses \@ifundefined mit \relax verglichen.

Das ist also letztlich ein Test, ob \@ifundefined undefiniert oder \relax ist, wobei als Seiteneffekt \@ifundefined zu \relax wird, falls es nicht definiert war.

Dagegen prüft
\ifcsname @ifundefined\endcsname
, ob \csname @ifundefined\endcsname einen Befehl definieren würde. Mit anderen Worten, es testet, ob \@ifundefined undefiniert ist.

Die beiden Tests unterscheiden sich also in zwei Punkten: Wenn \@ifundefined nicht definiert war, ist es nach dem ersten Test \relax, nach dem zweiten aber noch immer undefiniert. Wenn \@ifundefined \relax war, schlägt der zweite Test fehl bzw. führt den \else-Zweig aus, während der erste zutrifft. Vor allem dieser zweite Unterschied kann fatal sein. Daher ist eine bessere Ersetzung eventuell:
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname @ifundefined\endcsname
Diese definiert ein nicht definiertes \@ifundefined ebenfalls nicht als \relax, der Test ist ansonsten aber der gleiche wie bei
\expandafter\ifx\csname @ifundefined\endcsname\relax
Einen noch besseren Test bietet scrbase mit \scr@ifundefinedorrelax.

BTW: Bei mir funktioniert ein schlichtes
\documentclass{article}
\usepackage[version=3]{mhchem}
\usepackage[normalem]{ulem}
\let\MakeRobust\undefined
\usepackage{fontspec}
% oder xltxtra laden
\begin{document}
\[ 2+2=5 \]
\end{document}
Dabei wird die \MakeRobust-Definition von fixltx2e verwendet.

Besserwisser

Beitrag von Besserwisser »

Uups, da kam Ulrike mir während ich getippt habe, mit einer weiteren Antwort zuvor. Das "Nein" in meiner Antwort bezog sich auf die Frage, ob die beiden Tests identisch sind nicht auf Ulrikes neuerlichen Lösungsvorschlag.

Gast

Beitrag von Gast »

Das Beispiel läuft durch, wenn ich gleich hinter ulem fixltx2e lade. Genügt das?

Antworten