如何在 XeTeX 中修复 chemfig 的 chemmove

如何在 XeTeX 中修复 chemfig 的 chemmove

当尝试使用 编译chemfig手册“酯化:步骤 1”(第 22 页,第 11.2 节)中给出的xelatex示例时,输出与手册中给出的预期结果不匹配。当使用 编译示例时pdflatex,输出与预期结果匹配。

\setatomsep{7mm}
\schemestart
\chemfig{R-@{dnl}\lewis{26,O}-H}
\+
\chemfig{R-@{atoc}C([6]-OH)=[@{db}]O}
\arrow(.mid east--){<->[\chemfig{@{atoh}\chemabove{H}{\scriptstyle\oplus}}]}
\schemestop
\chemmove[shorten <=2pt]{
    \draw(dnl)..controls +(90:1cm)and+(north:1cm)..(atoc);
    \draw[shorten >=6pt](db)..controls +(north:5mm)and+(100:1cm)..(atoh);}

预期的: 在此处输入图片描述

实际的: 在此处输入图片描述

有没有办法在仍然使用 XeTeX 的同时解决这个问题?

答案1

这只是对 OP 问题的部分回答。

第一的,如何在 XeTeX 中修复 chemfig 的 chemmove? 我相信答案是,在大多数情况下,chemmove使用 编译时都能按预期工作XeLaTeX,如以下从 中的示例开发的简单测试所示ChemFig 手册

\documentclass[10pt,a4paper]{article}

\usepackage{chemfig}
\usepackage{fontspec}
\usepackage{caption}
\usepackage{verbatim}
\setmainfont{Arial}
\fboxsep=0pt
\renewcommand\printatom[1]{\ensuremath{\mathsf{#1}}}
\setatomsep{5mm}

\begin{document}
\begin{figure}
    \caption{XeLaTeX can be used to compile reaction schemes that use the \texttt{chemmove} macro. Example from: \textit{ChemFig Manual} v1.2d section 11.1 and 11.2  p20, December 2015}
    \vspace{1cm}
    \begin{tikzpicture}
        %Example from: ChemFig Manual v1.2d section 11.1  p20, December 2015} 
        \schemestart
        \chemfig{@{a1}=_[@{db}::30]-[::-60]\lewis{2,X}}
        \arrow{<->}
        \chemfig{\chemabove{\vphantom{X}}{\ominus}-[::30]=_[::-60]
            \chemabove{X}{\scriptstyle\oplus}}
        \schemestop
        \chemmove{\draw(db).. controls +(100:5mm) and +(145:5mm).. (a1);}
    \end{tikzpicture}\hspace{6cm}%
    \begin{tikzpicture}
        %Example from: ChemFig Manual v1.2d section 11.2  p22, December 2015} 
        \chemfig{R-O-C(-[2]R)(-[6]OH)-@{dnl}\lewis{26,O}H}\hspace{1cm}
        \chemfig{@{atoh}\chemabove{H}{\scriptstyle\oplus}}
        \chemmove{
            \draw[shorten <=2pt, shorten >=7pt]
            (dnl).. controls +(south:1cm) and +(north:1.5cm).. (atoh);}
    \end{tikzpicture}
\end{figure}
\end{document}

图。1

尽管如此,原帖作者在使用第 22 页的例子时显然遇到了问题ChemFig 手册(往上看)当代码被编译时XeLaTeX. 使用 进行编译时不会发生此问题pdfLaTeX

ChemFig建立在 之上Tikz。其宏允许绘制化学分子和反应方案等。

通过消去法,可以证明该问题归因于chemmove当它跨越用宏绘制的化学反应时绘制反应机制arrow

这里我使用了一些假设的反应方案来提供代码和输出的示例,以尝试找出问题的原因。通常,反应方案可以从使用ChemFig此类宏的简单代码编写和编译。

\documentclass[border=20pt,crop=true]{standalone}

\usepackage{chemfig}
%\usepackage{fontspec}
%\setmainfont{Comic Sans MS} %substitute with any font
%\defaultfontfeatures{Ligatures=TeX}
\setatomsep{5mm}

\begin{document}
    \schemestart
    \chemfig{@{x1}A}
    \arrow {<->} % this is the reaction
    \chemfig{@{x2}B}
    \schemestop
    \chemmove{\draw[shorten >=4pt](x1).. controls +(90:1cm) and +(90:1cm).. (x2);} % this may be relevant when something moves from A to B

\end{document}

它产生如下反应方案:

图2

另一方面,编译相同的代码,适当修改后用 XeLaTeX 调用 fontspec,结果如下。我无法解释使用pdfLaTeX和之间结果的奇怪差异XeLaTeX

图3

删除\arrow表明问题的根源在于\arrow命令。

图4

\documentclass[border=20pt,crop=true]{standalone}

\usepackage{chemfig}
\usepackage{fontspec}
\setmainfont{Comic Sans MS} %substitute with any font
\defaultfontfeatures{Ligatures=TeX}
\setatomsep{5mm}

\begin{document}
    \schemestart
        \chemfig{@{x1}A}
%        \arrow{<->}
        \chemfig{@{x2}B}
    \schemestop
    \chemmove{\draw[shorten >=4pt](x1).. controls +(90:1cm) and +(90:1cm).. (x2);}
\end{document}

部分解决方法可能是将箭头命令包装在子方案环境中,在这种情况下,会产生所需的反应方案。

图5

\documentclass[border=20pt,crop=true]{standalone}

\usepackage{chemfig}
\usepackage{fontspec}
\setmainfont{Comic Sans MS} %substitute with any font
\defaultfontfeatures{Ligatures=TeX}
\setatomsep{5mm}

\begin{document}
    \schemestart
    \chemfig{@{x1}A}
    \subscheme{\arrow(.mid east--) {<->}}
    \chemfig{@{x2}B}
    \schemestop
    \chemmove{\draw[shorten >=4pt](x1).. controls +(90:1cm) and +(90:1cm).. (x2);}
\end{document}

我并不认为 的使用subscheme代表了一种通用解决方案,因为我无法为 OP 的问题构建合适的子方案。更精通 ChemFig 语法的人也许可以做到这一点。

相关内容