我正在尝试在 ConTeXt 中创建一个电相位符号,类似于\phase{}
由 LaTeXsteinmetz
包中的命令生成的符号。
该符号如下所示:
(来源:robinbye.com)
有没有现成的,还是我需要自己开发?如果有,欢迎提出建议。我对 ConTeXt 和 MetaPost 还比较陌生。
这是包装里的肉steinmetz
,供参考。
\RequirePackage{pict2e}[2004/07/06]
\newsavebox{\stm@phasebox}
\newlength{\stm@phasedp}
\newlength{\stm@phaseht}
\newlength{\stm@phasetot}
\newlength{\stm@phasewd}
\newcommand\phase[2][1]{%
\sbox\stm@phasebox{$\ifcase#1\relax\displaystyle\or\textstyle\or\scriptstyle\or\scriptscriptstyle\fi#2$}
\stm@phaseht=\ht\stm@phasebox
\stm@phasedp=\dp\stm@phasebox
\stm@phasetot=\stm@phasedp \advance\stm@phasetot .35ex \advance\stm@phasetot\stm@phaseht
\stm@phasewd=\wd\stm@phasebox \advance\stm@phasewd .5\stm@phasetot
\setbox\stm@phasebox=\vbox to\stm@phaseht{
\hbox{\setlength{\unitlength}{1pt}\linethickness{.6pt}%
\edef\ph@x{\strip@pt\stm@phasewd}\edef\ph@y{\strip@pt\stm@phasetot}%
\dimen@ .5\stm@phasetot \edef\ph@dx{\strip@pt\dimen@}%
\begin{picture}(\ph@x,\ph@y)
\put(0,0){\circle*{.4}}
\put(0,0){\line(1,0){\ph@x}}\put(0,0){\line(1,2){\ph@dx}}
\put(\ph@dx,1.5){\raise\stm@phasedp\vbox{\box\stm@phasebox}}
\end{picture}%
}\vss}%
\advance\stm@phasedp .35ex \advance\stm@phasedp .6pt
\dp\z@=\stm@phasedp \box\stm@phasebox}
答案1
以下给出了类似的可用结果:
\startuseMPgraphic{formula}
picture p;
pair zu, zl;
numeric delta, width;
path roof;
width = 2.5 pt;
p := \MPbetex{txt};
zl := llcorner (p); zu := ulcorner (p);
delta := ypart(zu) - ypart(zl);
roof := zu -- zl + (-delta - width, -width) -- lrcorner (p) + (0, -width);
pickup pencircle scaled 0.7pt;
draw roof withcolor black;
draw p withcolor black;
\stopuseMPgraphic
\def\putfm#1{
\setMPtext{txt}{$ #1 $}
\hbox{\lower 4pt \hbox{\useMPgraphic{formula}}}
}
\starttext
\section{Vertical}
\putfm {1+2+3+4}
\section{Inline}
Lorem ipsum dolor sit amet, consectetuer \putfm {1-2-3-4-5} adipiscing
elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae,
felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget,
consectetuer id, vulputate a, magna. Donec vehicula augue eu
neque. Pellentesque habitant morbi tristique \putfm {\{a,b\}} senectus
et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras
viverra metus rhoncus sem. Nulla et lectus vestibulum urna fringilla
ultrices. Phasellus eu tellus sit amet tortor gravida
placerat. Integer sapien est, iaculis in, pretium quis, viverra ac,
\putfm {1+2+3+4+5} nunc. Praesent eget sem vel leo ultrices
bibendum. Aenean faucibus. Morbi dolor nulla, malesuada eu, pulvinar
at, mollis ac, nulla. Curabitur auctor semper nulla. Donec varius
orci eget risus. Duis nibh mi, congue eu, accumsan eleifend, sagittis
quis, diam. Duis \putfm {\Sigma x_i} eget orci sit amet orci dignissim
rutrum.
\stoptext
给予
问题:
- 我不太熟悉如何将 Metapost 图形设置为内联,当公式设置为内联时,上面的水平空间显然太多了。
setbounds
在 Metapost 中使用将控制生成的边界框。我没有摆弄这个,因为你想要什么将取决于你如何将这些公式设置为内联,也许你根本不想这样做; - 最后一个公式带有 ,
\Sigma
其中的 Steinmetz 线离公式内部太近了。 - 最后一个和倒数第三个公式的基线错误,因为它们内部的公式具有不同的深度,而代码无法处理。要处理这个问题需要更复杂的代码,例如在框寄存器内设置、查看深度以及
\raise
根据此值执行依赖操作。如果这很重要,我可以尝试修复它。steinmetz
您发布的 Latex 代码似乎可以做到这一点,这值得修复。