![witharrows - 使用 \settowidth 给出的长度的问题](https://linux22.com/image/415952/witharrows%20-%20%E4%BD%BF%E7%94%A8%20%5Csettowidth%20%E7%BB%99%E5%87%BA%E7%9A%84%E9%95%BF%E5%BA%A6%E7%9A%84%E9%97%AE%E9%A2%98.png)
以下代码不使用给出的偏移量\myl
。我遗漏了什么?
\documentclass{article}
\usepackage{witharrows}
\newlength\myl
\newcommand\doublearrow[2]{
\settowidth\myl{#1}%plus 2em
\addtolength\myl{10pt}
%Good length: \the\myl
\Arrow[tikz = ->]{#1}
\Arrow[xoffset=\myl,
tikz = <-]{#2}
}
\begin{document}
$\begin{WithArrows}
A & = B \doublearrow{Explication down to.}%
{Explication up to.}
\\ & = C
\end{WithArrows}$
\end{document}
答案1
我已经编写了一个新版本witharrows
(v. 2.5 2020-06-23),以便能够\DoubleArrow
根据 OP 的要求定义一个强大的命令。
在这个新版本的中witharrows
,引入了一种新型的单独箭头:类型o
(用于超过)。这样的箭头绘制在其他箭头之上,如下例所示。
\documentclass{article}
\usepackage{witharrows}
\begin{document}
$\begin{WithArrows}[groups]
A & = B \Arrow{one}\Arrow[o,jump=3]{direct} \\
& = C + C \Arrow{two} \\
& = D + D + D \Arrow{three} \\
& = E + E \\
& = F + F
\end{WithArrows}$
\end{document}
现在可以轻松定义\DoubleArrow
具有预期行为的强健命令:
\documentclass{article}
\usepackage{witharrows}
\NewDocumentCommand \DoubleArrow { O {} m m }
{
\Arrow[tikz=->,#1]{#2}%
\Arrow[o,tikz=<-,#1]{#3}
}
\begin{document}
$\begin{WithArrows}[groups]
A & = (a+b)^2 \DoubleArrow[tikz={font=\bfseries}]{expansion}{factorization} \\
& = a^2 + 2ab+b^2
\end{WithArrows}$
\end{document}
答案2
由于某种原因,您需要将长度设为全局才能使其工作。(可能WithArrows
扫描命令\Arrow
并使用它们做一些不错的技巧。)
\documentclass{article}
\usepackage{witharrows}
\newlength\myl
\newcommand\doublearrow[2]{%
\settowidth\myl{#1}%
\global\myl=\myl%
\Arrow[tikz = ->]{#1}%
\Arrow[xoffset = \dimexpr\myl+1em,tikz = <-]{#2}%
}
\begin{document}
$\begin{WithArrows}
A & = B \doublearrow{Explication down to.}%
{Explication up to}
\\ & = C
\end{WithArrows}$
\end{document}
我还添加了一个宽限距离,1em
但这与问题无关。
答案3
如果想要一个\doublearrow
可以在相同环境中多次使用的宏{WithArrows}
,则不能使用全局维度。必须在执行命令之前\mylen
在选项中用其数值替换。[xoffset = \mylen]
\Arrow
以下代码提供了一种方法。
\documentclass{article}
\usepackage{witharrows}
\WithArrowsOptions{tikz={font=}}
\ExplSyntaxOn
\NewDocumentCommand \doublearrow { m m }
{
\hbox_set:Nn \l_tmpa_box { #1 }
\dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box + 20 pt }
\Arrow [tikz = ->] { #1 }
\use:x { \Arrow [xoffset=\dim_use:N \l_tmpa_dim , tikz = <-] } { #2 }
}
\ExplSyntaxOff
\begin{document}
$\begin{WithArrows}
A & = B \doublearrow{$1+2$}{$3+4$} \\
& = C \\
& = D \doublearrow{up to down}{down to up} \\
& = E
\end{WithArrows}$
\end{document}
事实上,这个代码并不完美,原因有二。
第一个参数
\Arrow
被组合了两次。如果该参数中有具有副作用的代码(例如\footnote
),则会出现问题。第一个标签的宽度
\Arrow
是在没有应用潜在格式选项(键tikz={font={...}}
)的情况下计算的。如果使用此类选项,则计算出的宽度将是错误的,第二个箭头的位置也将是错误的。这就是为什么,对于同质行为,我认为是\WithArrowsOptions{tikz={font=}}
有效的。