witharrows - 使用 \settowidth 给出的长度的问题

witharrows - 使用 \settowidth 给出的长度的问题

以下代码不使用给出的偏移量\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=}}有效的。

相关内容