我非常喜欢 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
答案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:我对做这种事情还很陌生,所以欢迎提出改进建议!)
有点随意,我将选择字母a
到l
(小写 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
}
请注意,仅支持字母a
,l
这可能会以多种无法预见的方式中断,包括(我认为)负整数输入(但这些在原始实现中不起作用)。检查输入是整数还是字母的行来自此处:如何检查参数的值是否为数字?(看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}