在 ChemFig 中是否有绘制 30 度键角增量的快捷方式?

在 ChemFig 中是否有绘制 30 度键角增量的快捷方式?

我非常喜欢 ChemFig 中的功能,它可以通过指定整数而不是直接指定角度来以 45 度为增量选择键角:\chemfig{-[1]}。现在,我正在绘制一堆碳氢化合物分子,我认为键角以 30 度为增量看起来更好。当然,我可以使用语法指定每个角度[:angle],但输入太多了!有没有类似的 30 度角的快捷方式?

\documentclass{standalone}
\usepackage{chemfig}
\begin{document}
\chemfig{-[:30]-[:330]-[:30]-[:330]}
\end{document}

答案1

这个想法是创建一个新的宏\setangleincrement,允许设置[<number>]跟随键时角度的增量。这可能是下一个版本的新功能……

\documentclass{article}
\usepackage{chemfig}
\makeatletter
\CF@def\setangleincrement{\def\CF@angle@increment}
\setangleincrement{45}% default value
\def\CF@set@bondangle#1#2{% le code de la direction est contenu dans #1, en sortie, #2 contient l'angle
    \ifx\@empty#1\@empty%
        \let#2\CF@default@angle
    \else
        \if:\expandafter\noexpand\@car#1\@nil
            \if:\expandafter\expandafter\expandafter\noexpand\expandafter\@car\@gobble#1\@nil
                \pgfmathsetmacro#2{\CF@previous@angle+\expandafter\@gobble\@gobble#1}%
            \else
                \expandafter\def\expandafter#2\expandafter{\@gobble#1}%
            \fi
        \else
            \pgfmathsetmacro#2{#1*\CF@angle@increment}%
        \fi% puis normalise l'angle entre 0 et 360
        \ifdim\ifdim#2pt<\z@-\fi#2pt>360pt \pgfmathsetmacro #2{#2-360*floor(#2/360)}\fi% si |#2|>360
    \fi
}
\makeatother
\begin{document}
45 degres increment: \chemfig{-[9]-[-1]-[1]-[-1]}

\setangleincrement{30}
30 degres increment: \chemfig{-[1]-[-1]-[1]-[-1]}
\end{document}

在此处输入图片描述

答案2

您可以使用\setchemfig

在此处输入图片描述

\documentclass{article}
\usepackage{chemfig}
\begin{document}
\setchemfig{angle increment=30}
\chemfig{-[1]-[-1]-[1]-[-1]-[1]-[-1]-[1]}
\end{document}

答案3

根据使用情况我将使用 submols:

\documentclass{standalone}
\usepackage{chemfig}
\definesubmol{r}{-[::-60]}
\definesubmol{l}{-[::60]}
\begin{document}
\chemfig{[:30]-!r!l!r!l}
\end{document}

答案4

好吧,没有内置方法来使用这种快捷方式。但是,我们可以通过重新编写\def处理键角规范的代码来破解一个。(PS:我对做这种事情还很陌生,所以欢迎提出改进建议!)

有点随意,我将选择字母al(小写 ell)来表示 0 到 330 度的角度。然后,我们只需在宏的底部添加一些代码,在处理整数规范的地方处理字母而不是数字:

\def\CF@set@bondangle#1#2{
    \ifx\@empty#1\@empty%
        \let#2\CF@default@angle
    \else
        \if
             ...% In the code I've removed, it reads the explicit angle specification
        \else % Here is the new code
            \ifnum0<0#1\relax% First check if the input is an integer or a letter
                \ifnum#1>7% If an integer, process as before. This code is unchanged
                    \pgfmathparse{#1-floor(#1/8)*8}
                    \ifdim\pgfmathresult pt<\z@\pgfmathparse{\pgfmathresult+8}\fi
                    \edef#2{\ifcase\expandafter\CF@int@part\pgfmathresult\@nil0\or45\or90\or135\or180\or225\or270\or315\else-1\fi}
                \else
                    \edef#2{\ifcase#1 0\or45\or90\or135\or180\or225\or270\or315\else-1\fi}%
                \fi
            \else% Otherwise, process the letter into an integer and assign the proper angle
                \edef#2{\ifcase\numexpr`#1 - `a\relax 0\or30\or60\or90\or120\or150\or180\or210\or240\or270\or300\or330\else-1\fi}%
            \fi%
        \fi
    \fi
}

请注意,仅支持字母al这可能会以多种无法预见的方式中断,包括(我认为)负整数输入(但这些在原始实现中不起作用)。检查输入是整数还是字母的行来自此处:如何检查参数的值是否为数字?(看egreg 的回答),检查字母大小写的代码由大卫·卡莱尔

梅威瑟:

\documentclass{standalone}
\usepackage{chemfig}
\makeatletter
\def\CF@set@bondangle#1#2{% le code de la direction est contenu dans #1, en sortie, #2 contient l'angle
    \ifx\@empty#1\@empty%
        \let#2\CF@default@angle
    \else
        \if:\expandafter\noexpand\@car#1\@nil
            \if:\expandafter\expandafter\expandafter\noexpand\expandafter\@car\@gobble#1\@nil
                \pgfmathparse{\CF@previous@angle+\expandafter\@gobble\@gobble#1}%
                \let#2\pgfmathresult
            \else
                \expandafter\def\expandafter#2\expandafter{\@gobble#1}%
            \fi% puis normalise l'angle entre 0 et 360
            \ifdim\ifdim#2pt<\z@-\fi#2pt>360pt % si |#2|>360
                \pgfmathparse{#2-360*floor(#2/360)}%
                \ifdim\pgfmathresult pt<\z@\pgfmathparse{\pgfmathresult+360}\fi
                \let#2\pgfmathresult
            \else
                \ifdim#2pt<\z@
                    \pgfmathparse{#2+360}%
                    \let#2\pgfmathresult
                \fi
            \fi
        \else
            \ifnum0<0#1\relax%
                \ifnum#1>7
                    \pgfmathparse{#1-floor(#1/8)*8}%
                    \ifdim\pgfmathresult pt<\z@\pgfmathparse{\pgfmathresult+8}\fi
                    \edef#2{\ifcase\expandafter\CF@int@part\pgfmathresult\@nil0\or45\or90\or135\or180\or225\or270\or315\else-1\fi}
                \else
                    \edef#2{\ifcase#1 0\or45\or90\or135\or180\or225\or270\or315\else-1\fi}%
                \fi
            \else
                \edef#2{\ifcase\numexpr`#1 - `a\relax 0\or30\or60\or90\or120\or150\or180\or210\or240\or270\or300\or330\else-1\fi}%
            \fi%
        \fi
    \fi
}
\makeatother

\begin{document}
\chemfig{-[:30]-[l]-[b]-[:330]}
\end{document}

在此处输入图片描述

相关内容