因此,在学校(美国以外),我们的老师给了我们这种化学符号:
其中 Ar 是相对原子质量,Z 是原子序数,p 个质子,n 个中子。例如:
更新:我想用它制作一个宏,但是 \atomicnumber 存在问题,我认为它返回一个字符串而不是整数或类似的东西:
\documentclass[a4paper]{article}
\usepackage{chemmacros}
\usepackage{bohr}
\usepackage{tikz}
\newcounter{neutron}
\newcommand{\mychemistry}[2]{\setcounter{neutron}{\numexpr#2-\atomicnumber{#1}\relax}\ch{^{#2}\atomicnumber{#1}#1}\tikz[baseline=(char.base)]{ \node[shape=circle,draw,inner sep=2pt] (char) {+\atomicnumber{#1}};}(\atomicnumber{#1} p,\theneutron n)}
\begin{document}
\mychemistry{O}{18}
\end{document}
答案1
编辑 2015-12-14 – 适应使用elements
包
这个想法与原始答案中的想法相同,见下文。bohr
包不再提供\atomicnumber
。它现在由包提供elements
。后者还提供了,\saveatomicnumber<cs>{<element>}
这使得宏更容易一些:
\saveatomicnumber\@tmp{#1}
进而
\the\numexpr#2-\@tmp\relax
表示中子的数量。
\documentclass[a4paper]{article}
\usepackage{chemformula}
\usepackage{elements}
\usepackage{tikz}
\makeatletter
\newcommand*\mychemistry[2]{%
\saveatomicnumber\@tmp{#1}%
\ch{^{#2}_{\atomicnumber{#1}}#1}
\tikz[baseline]{
\node[anchor=base,shape=circle,draw,inner sep=2pt]
{+\atomicnumber{#1}};
}
(%
\atomicnumber{#1} p,
\the\numexpr#2-\@tmp\relax
n%
)%
}
\makeatother
\begin{document}
\mychemistry{O}{18}
\end{document}
bohr
使用包的早期答案
编辑问题的答案:\atomicnumber
不可扩展,因此无法使用\numexpr ... \relax
。但是,如果您确定只输入元素象征并且永远不会元素姓名您可以使用内部命令。对于元素,F
这是\@bohr@atom@number@f
,对于Ne
它是\@bohr@atom@number@ne
,等等。
为了将它与大写原子符号一起用作输入,您需要\lowercase{...}
输入。again\lowercase
不可扩展,但您可以简单地用\setcounter
它包围该部分。实际上,计数器甚至不需要,因为它仅用于确定中子的数量。可以\numexpr
直接在它前面加上来使用\the
。为了构建所需的宏名称,我们可以使用原语\csname...\endcsname
或 LaTeX 的包装器\@nameuse{...}
,它们都是可扩展的。在命令中,它将类似于\csname @bohr@atom@number@#1\endcsname
或\@nameuse{@bohr@atom@number@#1}
。
把它们放在一起,你就可以得到中子的数量
\lowercase{\the\numexpr#2-\csname @bohr@atom@number@#1\endcsname\relax}
或者
\lowercase{\the\numexpr#2-\@nameuse{@bohr@atom@number@#1}\relax}
根据你的例子,我添加了缩进和在需要的地方添加注释字符但我还在不同部分之间留了空格,因为这样看起来更易读。我还省略了命名,因为也可以使用节点的 as 选项\node
来实现与基线的对齐。anchor=base
\documentclass[a4paper]{article}
\usepackage{chemformula}% the package that provides `\ch` and which is loaded by `chemmacros'
\usepackage{bohr}
\usepackage{tikz}
\newcommand*\mychemistry[2]{%
\ch{^{#2}_{\atomicnumber{#1}}#1}
\tikz[baseline]{
\node[anchor=base,shape=circle,draw,inner sep=2pt]
{+\atomicnumber{#1}};
}
(%
\atomicnumber{#1} p,
\lowercase{\the\numexpr#2-\csname @bohr@atom@number@#1\endcsname\relax}
n%
)%
}
\begin{document}
\mychemistry{O}{18}
\end{document}
顺便说一句:如果你chemmacros
已经使用,你也可以轻松地将质子输出为 p +,将中子输出为 n 0:
\documentclass[a4paper]{article}
\usepackage{chemmacros}
\usepackage{bohr}
\usepackage{tikz}
\newcommand*\mychemistry[2]{%
\ch{^{#2}_{\atomicnumber{#1}}#1}
\tikz[baseline]{
\node[anchor=base,shape=circle,draw,inner sep=2pt]
{+\atomicnumber{#1}};
}
(%
\atomicnumber{#1} \prt, % <<<<<<<<<
\lowercase{\the\numexpr#2-\csname @bohr@atom@number@#1\endcsname\relax}
\ntr % <<<<<<<<<
)%
}
\begin{document}
\mychemistry{O}{18}
\end{document}
\prt
实际上只是相当于\chcpd{p+}
和,所以\ntr
实际上并不是需要的,而且就足够了。\chcpd{n^0}
chemmacros
chemformula
答案2
这就是你想要的吗?我定义了一个\chemelt
命令,语法非常简单:输入元素符号、原子序数和原子质量的逗号分隔列表(按顺序)。它需要加载pstricks
(对于圆圈框),pdf
选择使用 pdfLaTeX 进行编译,xparse
(对于简单语法)和mathtools
(对于 prescript
命令)。
\documentclass[a4paper,12pt, pdf]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} %
\usepackage{lmodern}
\usepackage{pst-node}
\newcounter{neutron}
\usepackage{mathtools}
\usepackage{xparse}
\DeclareDocumentCommand{\chemelt}{>{\SplitArgument{2}{,}}m}
{\chemeltaux#1}
\NewDocumentCommand{\chemeltaux}{mmm}{\setcounter{neutron}{\numexpr#3-#2\relax}\def\C{\pscirclebox{+8}} \ensuremath{\mathrm{\prescript{#3}{#2}#1}}\raisebox{-0.25\height}{\scriptsize\pscirclebox[framesep = 1pt, linewidth = 0.6pt]{+#2} (#2p,\theneutron n)}}
\begin{document}
\chemelt{O, 8,16}\\
\chemelt{F, 9,19}
\end{document}