xelatex freeze mit Paketen mhchem, ulem, fontspec

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: xelatex freeze mit Paketen mhchem, ulem, fontspec

von Gast » Di 12. Nov 2013, 14:35

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

von Besserwisser » Di 12. Nov 2013, 14:34

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.

von Besserwisser » Di 12. Nov 2013, 14:33

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.

von u_fischer » Di 12. Nov 2013, 14:17

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

von Gast » Di 12. Nov 2013, 13:58

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]

von u_fischer » Di 12. Nov 2013, 13:11

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.

xelatex freeze mit Paketen mhchem, ulem, fontspec

von Gast » Di 12. Nov 2013, 12:33

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]

Nach oben