Seite 1 von 1

xelatex freeze mit Paketen mhchem, ulem, fontspec

Verfasst: Di 12. Nov 2013, 12:33
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]

Verfasst: Di 12. Nov 2013, 13:11
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.

Verfasst: Di 12. Nov 2013, 13:58
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]

Verfasst: Di 12. Nov 2013, 14:17
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

Verfasst: Di 12. Nov 2013, 14:33
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.

Verfasst: Di 12. Nov 2013, 14:34
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.

Verfasst: Di 12. Nov 2013, 14:35
von Gast
Das Beispiel läuft durch, wenn ich gleich hinter ulem fixltx2e lade. Genügt das?