我对使用 tikzpicture 包有疑问。
我有一个协议交互,其中两个参与者想要交换一些数字,比如α和β我需要双箭头,而且在它上面α以及其下方β。这意味着这两个参与者正在同时交换数字。顺便说一句,我不需要箭头边上的点,而是需要一些计算,从而得出α或者β必须放在那里。
我如何得到这个输出?我不知道我是否选择了正确的包,但在我看来这是正确的选择。到目前为止,我看到的每个示例都使用一些点并创建一个矩阵,但我不知道如何用这些项替换点。顺便说一句,我不知道如何得到那个箭头,甚至让它变大。
任何有接近我需要的例子的优秀教程都将不胜感激。
答案1
您不需要 TikZ。如果您使用 LaTeX,您只需要amsmath
和mathtools
包(您可能都有):
\documentclass{minimal}
\usepackage{amsmath}
\usepackage{mathtools}
\begin{document}
\[\begin{matrix}
x \xleftarrow{\quad R\quad} \mathcal{Z}_q &\quad
\xrightleftharpoons[\beta=g^y]{\quad\alpha=g^x\quad} \quad&
y \xleftarrow{\quad R\quad} \mathcal{Z}_q \\
g^{xy} & & g^{xy} \\
\end{matrix}\]
\end{document}
这将产生以下输出:
amsmath 包提供了\xleftarrow
和\xrigharrow
命令,分别设置可扩展的\leftarrow
和\righarrow
;它们的强制参数设置在顶部,可选参数设置在下方(\xleftarrow[below]{above}
)。通常,它的宽度与文本的需要一样宽,因此我\quad
在文本周围插入了 s 以将其隔开。mathtools
扩展的包amsmath
提供了更多可扩展的箭头,包括\xleftrightarrow
(用于可扩展的 ↔)、\xLeftrightarrow
(用于可扩展的 ⇔)、\xleftrighharpoons
(用于可扩展的 ⇋;示例图片中符号的倒置版本)和\xrightleftharpoons
(用于可扩展的 ⇌,如示例图片所示),您可以根据自己的喜好在这里使用其中任何一个。
另外,请注意不应该需要像我一样分开\xrightleftharpoons
(这就是为什么有&\quad ... \quad&
),但显然我需要在这里(虽然在拉特西我没有,所以只要做一些小改动,你可能就不需要了。你只需要这里的矩阵,因为你想将 sg^{xy}
与第一个和第三个箭头对齐;如果你只想要顶线,你就不需要费心了。
答案2
这是一个带有eplain的:
\input eplain
$$
\matrix{x \mapleft^R {\cal Z}_q &
\adjmapleft^{\mathstrut\alpha = g^x}_{\beta = g^y} &
y \mapleft^R {\cal Z}_q \cr
g^{xy} && g^{xy}}
$$
\bye
看起来像:
但没有鱼叉 :-(
更新:关于某些箭头等扩展到“内容”的方式,我只是想指出,似乎有几种方法可以实现这一点:
- 字符组合
\leaders
- 赞成:可以很好地扩展——根据需要尽可能长或尽可能短
- 反对:可以清楚地看到组合展示中由于某种原因(未打印)。根据缩放级别和使用的阅读器,效果可能会令人不快。我记得看到过关于此问题的讨论,但不记得是否取得了一些好的结果。
- 根据内容选择合适的变体
- 赞成:在屏幕上看起来也很漂亮、很清晰
- 反对:没有必要按需要进行扩展。
现在,关于 XeTeX 和 Unicode 上下文中的第二个列表项,一些字符似乎支持自动变体选择。我不知道这是否发生在字体本身、XeTeX 或其他地方。无论如何,我已经编译了一组宏来支持\rightleftharpoons
XeTeX 中的扩展。冒着成为 tex.SE 笑柄的风险,我想分享它们:
\input something_that_sets_up_fonts_and_mathchars_etc_with_say_XITS_Math
\def\buildharpoons#1#2{$\vcenter{\hbox{\ooalign{%
\lower1.25\fontdimen5\textfont1\hbox{$#1$}\crcr
$#2$\crcr}}}$}
\def\rlshortharpoons{\buildharpoons{%
\XeTeXmathchar"3"1"E049}{\XeTeXmathchar"3"1"E04D}}
\def\rlmedharpoons{\buildharpoons{%
\XeTeXmathchar"3"1"E092}{\XeTeXmathchar"3"1"E096}}
\def\rlMedharpoons{\buildharpoons{%
\XeTeXmathchar"3"1"E0C7}{\XeTeXmathchar"3"1"E0CB}}
\def\rllongharpoons{\buildharpoons{%
\XeTeXmathchar"3"1"E0FB}{\XeTeXmathchar"3"1"E0FF}}
\def\rlLongharpoons{\buildharpoons{%
\XeTeXmathchar"3"1"E126}{\XeTeXmathchar"3"1"E12A}}
\def\buildharprel#1#2#3{\mathrel{\mathop{#1}\limits^{#2}_{#3}}}
\def\harpoons#1#2{%
\setbox0=\hbox{\rlshortharpoons}\setbox1=\hbox{\rlmedharpoons}
\setbox2=\hbox{\rlMedharpoons} \setbox3=\hbox{\rllongharpoons}
\setbox4=\hbox{\rlLongharpoons}
\setbox5=\hbox{$#1$} \setbox6=\hbox{$#2$}
\ifdim\wd5<\wd6 \dimen7=\wd6 \else\dimen7=\wd5 \fi
\ifdim\dimen7<\wd0 \buildharprel{\box0}{#1}{#2}
\else\ifdim\dimen7<\wd1 \buildharprel{\box1}{#1}{#2}
\else\ifdim\dimen7<\wd2 \buildharprel{\box2}{#1}{#2}
\else\ifdim\dimen7<\wd3 \buildharprel{\box3}{#1}{#2}
\else\buildharprel{\box4}{#1}{#2}\fi\fi\fi\fi}
$$
x \mathop{\longleftarrow}\limits^R {\cal Z}
\harpoons{\alpha=g^x}{\beta = g^y} y
\harpoons{\alpha}{\beta} q
\mathop{\longleftarrow}\limits^R {\cal Z_q}
$$
\bye
看起来像这样(我修改了公式只是为了显示扩展,很可能在此过程中使其变得毫无意义):
我意识到\harpoons
-macro 肯定可以使用一些优化,但你就这样了。
答案3
以下是我根据要求使用 TikZ 的尝试:
\begin{tikzpicture}
\node (A) at (0,0) {$x$};
\node (B) at (1,-1) {$g^{xy}$};
\node (C) at (2,0) {$Z_{q}$};
\node (D) at (4,0) {$y$};
\node (E) at (5,-1) {$g^{xy}$};
\node (F) at (6,0) {$Z_{q}$};
\begin{scope}[every node/.style={font= \scriptsize}]
\draw [latex-] (A) -- node[above]{$R$} (C);
\draw[transform canvas={yshift=0.2ex},-left to] (C) -- node[above]{$\alpha=g^{x}$} (D);
\draw[transform canvas={yshift=-0.2ex},left to-] (C) -- node[below]{$\beta=g^{y}$} (D);
\draw[latex-] (D) -- node[above]{$R$} (F);
\end{scope}
\end{tikzpicture}
生成结果:
诀窍是transform canvas
获得rightleftharpoon
等效命令。可以通过更改设置来调整间距,以满足个人需求\node
。