折叠/展开长导数方程组

折叠/展开长导数方程组

我正在展示一个很长的推导过程(此处有简化的示例)

\documentclass{article}

\begin{document}

\begin{eqnarray*}
0 &=& 0 \\
&\downarrow& \mbox{using eq.}~\ref{eq0} \\
&=& 1 \\
&\downarrow& \mbox{using eq.}~\ref{eq1} \\
&=& 2 \\
&\downarrow& \mbox{using eq.}~\ref{eq2} \\
&=& 3
\end{eqnarray*}

\begin{equation}
0
\label{eq0}
\end{equation}

\begin{equation}
1
\label{eq1}
\end{equation}

\begin{equation}
2
\label{eq2}
\end{equation}

\end{document}

我只想有一个折叠表示在生成的 PDF 中仅显示行“0=0”和最后的“=3”。理想的行为是,在这两行之间有一个按钮,当鼠标悬停或按下时,按钮将触发弹出窗口,显示整个推导过程

目的是让读者能够快速看到开始和结束,而不必在第一眼看到中间的所有细节。当然,我可以将推导放在附录中,但导航会变得困难(尤其是考虑到中间方程本身引用了其他方程)。

这个问题与以下内容密切相关: Latex 中的可折叠/可扩展文本

但我找不到一种方法来调整具有对齐方程的代码。下图给出了所需行为的示例。

在此处输入图片描述

答案1

以 J. Kormylo 的例子为基础,没有垂直间隙,并利用

\tootip****{...}{...}[<x-off>][<y-off>]宏(Evince、A-Reader):

\documentclass{article}
\usepackage{mathtools}

\usepackage{hyperref}
%patch hyperref to make PDF Annotations PDF-Layer-(OCG)-aware
\makeatletter
  \let\Hy@setpdfborderOrig\Hy@setpdfborder
  \def\Hy@setpdfborder{\ocgbase@insert@oc\Hy@setpdfborderOrig}%
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% tooltips with LaTeX v. 2018/01/15
%
% \tooltip[*[*[*[*]]]]
%            [<link colour>]{<link text>}
%            [<tip box colour>]{<tip text>}
%            [<x-offset>,<y-offset>]
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%   \tooltip     --> draggable tip, visible on mouse-over, hidden on mouse-out
%
%   \tooltip*    --> draggable tip, toggle visiblity on mouse-over
%
%   \tooltip**   --> NON-draggable tip, visible on mouse-over, hidden on mouse-out
%
%   \tooltip***  --> NON-draggable tip, toggle visiblity on mouse-over
%
%   \tooltip**** --> NON-draggable tip, toggle visiblity on mouse-click (Evince!)
%
% Default link colour can be set with
%
%   \usepackage[linkcolor=<colour>]{hyperref}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{xparse,ocgbase}
\usepackage{xcolor,calc}
\usepackage{tikzpagenodes,linegoal}
\usetikzlibrary{calc}

\ExplSyntaxOn
\let\tpPdfLink\pbs_pdflink:nn
\let\tpPdfAnnot\pbs_pdfannot:nnnn\let\tpPdfLastAnn\pbs_pdflastann:
\let\tpAppendToFields\pbs_appendtofields:n
\def\tpPdfXform{\pbs_pdfxform:nnnnn{1}{1}{}{}}
\let\tpPdfLastXform\pbs_pdflastxform:
\let\cListSet\clist_set:Nn\let\cListItem\clist_item:Nn
\ExplSyntaxOff

\makeatletter
\NewDocumentCommand{\tooltip}{%
  ssssO{\ifdefined\@linkcolor\@linkcolor\else blue\fi}mO{yellow!20}mO{0pt,0pt}%
}{{%
  \leavevmode%
  \IfBooleanT{#2}{%
    %for variants with two and more stars, put tip box on a PDF Layer (OCG)
    \ocgbase@new@ocg{tipOCG.\thetcnt}{%
      /Print<</PrintState/OFF>>/Export<</ExportState/OFF>>%
    }{false}%
    \xdef\tpTipOcg{\ocgbase@last@ocg}%
    %prevent simultaneous visibility of multiple non-draggable tooltips
    \ocgbase@add@ocg@to@radiobtn@grp{tool@tips}{\ocgbase@last@ocg}%
  }%
  \tpPdfLink{%
    \IfBooleanTF{#4}{%
      /Subtype/Link/Border[0 0 0]/A <</S/SetOCGState/State [/Toggle \tpTipOcg]>>
    }{%
      /Subtype/Screen%
      /AA<<%
        \IfBooleanTF{#3}{%
          /E<</S/SetOCGState/State [/Toggle \tpTipOcg]>>%
        }{%
          \IfBooleanTF{#2}{%
            /E<</S/SetOCGState/State [/ON \tpTipOcg]>>%
            /X<</S/SetOCGState/State [/OFF \tpTipOcg]>>%
          }{
            \IfBooleanTF{#1}{%
              /E<</S/JavaScript/JS(%
                var fd=this.getField('tip.\thetcnt');%
                if(typeof(click\thetcnt)=='undefined'){%
                  var click\thetcnt=false;%
                  var fdor\thetcnt=fd.rect;var dragging\thetcnt=false;%
                }%
                if(fd.display==display.hidden){%
                  fd.delay=true;fd.display=display.visible;fd.delay=false;%
                }else{%
                  if(!click\thetcnt&&!dragging\thetcnt){fd.display=display.hidden;}%
                  if(!dragging\thetcnt){click\thetcnt=false;}%
                }%
                this.dirty=false;%
              )>>%
            }{%
              /E<</S/JavaScript/JS(%
                var fd=this.getField('tip.\thetcnt');%
                if(typeof(click\thetcnt)=='undefined'){%
                  var click\thetcnt=false;%
                  var fdor\thetcnt=fd.rect;var dragging\thetcnt=false;%
                }%
                if(fd.display==display.hidden){%
                  fd.delay=true;fd.display=display.visible;fd.delay=false;%
                }%
               this.dirty=false;%
              )>>%
              /X<</S/JavaScript/JS(%
                if(!click\thetcnt&&!dragging\thetcnt){fd.display=display.hidden;}%
                if(!dragging\thetcnt){click\thetcnt=false;}%
                this.dirty=false;%
              )>>%
            }%
            /U<</S/JavaScript/JS(click\thetcnt=true;this.dirty=false;)>>%
            /PC<</S/JavaScript/JS (%
              var fd=this.getField('tip.\thetcnt');%
              try{fd.rect=fdor\thetcnt;}catch(e){}%
              fd.display=display.hidden;this.dirty=false;%
            )>>%
            /PO<</S/JavaScript/JS(this.dirty=false;)>>%
          }%
        }%
      >>%
    }%
  }{{\color{#5}#6}}%
  \sbox\tiptext{%
    \IfBooleanT{#2}{%
      \ocgbase@oc@bdc{\tpTipOcg}\ocgbase@open@stack@push{\tpTipOcg}}%
    \fcolorbox{black}{#7}{#8}%
    \IfBooleanT{#2}{\ocgbase@oc@emc\ocgbase@open@stack@pop\tpNull}%
  }%
  \cListSet\tpOffsets{#9}%
  \edef\twd{\the\wd\tiptext}%
  \edef\tht{\the\ht\tiptext}%
  \edef\tdp{\the\dp\tiptext}%
  \tipshift=0pt%
  \IfBooleanTF{#2}{%
    %OCG-based (that is, all non-draggable) boxes should not extend beyond the
    %current column as they may get overlaid by text in the neighbouring column
    \setlength\whatsleft{\linegoal}%
  }{%
    \measureremainder{\whatsleft}%
  }%
  \ifdim\whatsleft<\dimexpr\twd+\cListItem\tpOffsets{1}\relax%
    \setlength\tipshift{\whatsleft-\twd-\cListItem\tpOffsets{1}}\fi%
  \IfBooleanF{#2}{\tpPdfXform{\tiptext}}%
  \raisebox{\heightof{#6}+\tdp+\cListItem\tpOffsets{2}}[0pt][0pt]{%
    \makebox[0pt][l]{\hspace{\dimexpr\tipshift+\cListItem\tpOffsets{1}\relax}%
    \IfBooleanTF{#2}{\usebox{\tiptext}}{%
      \tpPdfAnnot{\twd}{\tht}{\tdp}{%
        /Subtype/Widget/FT/Btn/T (tip.\thetcnt)%
        /AP<</N \tpPdfLastXform>>%
        /MK<</TP 1/I \tpPdfLastXform/IF<</S/A/FB true/A [0.0 0.0]>>>>%
        /Ff 65536/F 3%
        /AA <<%
          /U <<%
            /S/JavaScript/JS(%
              var fd=event.target;%
              var mX=this.mouseX;var mY=this.mouseY;%
              var drag=function(){%
                var nX=this.mouseX;var nY=this.mouseY;%
                var dX=nX-mX;var dY=nY-mY;%
                var fdr=fd.rect;%
                fdr[0]+=dX;fdr[1]+=dY;fdr[2]+=dX;fdr[3]+=dY;%
                fd.rect=fdr;mX=nX;mY=nY;%
              };%
              if(!dragging\thetcnt){%
                dragging\thetcnt=true;Int=app.setInterval("drag()",1);%
              }%
              else{app.clearInterval(Int);dragging\thetcnt=false;}%
              this.dirty=false;%
            )%
          >>%
        >>%
      }%
      \tpAppendToFields{\tpPdfLastAnn}%
    }%
  }}%
  \stepcounter{tcnt}%
}}
\makeatother
\newsavebox\tiptext\newcounter{tcnt}
\newlength{\whatsleft}\newlength{\tipshift}
\newcommand{\measureremainder}[1]{%
  \begin{tikzpicture}[overlay,remember picture]
    \path let \p0 = (0,0), \p1 = (current page.east) in
      [/utils/exec={\pgfmathsetlength#1{\x1-\x0}\global#1=#1}];
  \end{tikzpicture}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newcommand{\centerwithin}[2]{% #1=small symbol, #2=wide symbol
  {\mathmakebox[\widthof{\ensuremath{{}#2{}}}][c]{{#1}}}}

\begin{document}

\newcommand\tempbox{%
\begin{minipage}{0.18\textwidth}% almost impassible to pre-measure
\abovedisplayskip=0pt
\belowdisplayskip=0pt
\begin{align*}
&\centerwithin{\downarrow}{=} \text{using eq.~\eqref{eq0}} \\
&= 1 \\
&\centerwithin{\downarrow}{=} \mbox{using eq.~\eqref{eq1}} \\
&= 2 \\
&\centerwithin{\downarrow}{=} \mbox{using eq.}~\eqref{eq2}
\end{align*}
\end{minipage}}

\begin{align*}
0 &= 0\\
  &\makebox[0pt][r]{%
     \tooltip****{\fbox{\bfseries +}}{\tempbox}[-0.4em,-4ex]%
   }\\
  & = 3
\end{align*}

\begin{equation}
0
\label{eq0}
\end{equation}

\begin{equation}
1
\label{eq1}
\end{equation}

\begin{equation}
2
\label{eq2}
\end{equation}

\end{document}

答案2

我不确定如何处理方程 (1) 到 (3),所以我就保留了它们。我过去常常\tempbox将长推导与 OCG 代码分开,并将\switchbox推导与方程对齐。

注意使用flalign来左对齐推导。由于方程式会扩展以填充整个列,因此很难测量所需的宽度。

\documentclass{article}
\usepackage{mathtools}
\usepackage{ocgx}

\newsavebox{\tempbox}% simplify source
\newsavebox{\switchbox}% measure width
\savebox{\switchbox}{\fcolorbox{blue}{red}{\bfseries +}}

\newcommand{\centerwithin}[2]{% #1=small symbol, #2=wide symbol
  {\mathmakebox[\widthof{\ensuremath{{}#2{}}}][c]{{#1}}}}

\begin{document}

\savebox{\tempbox}{\begin{minipage}{0.5\textwidth}% almost impassible to pre-measure
\abovedisplayskip=0pt
\belowdisplayskip=0pt
\begin{flalign*}
&\centerwithin{\downarrow}{=} \text{using eq.~\ref{eq0}} &\\
&= 1 \\
&\centerwithin{\downarrow}{=} \mbox{using eq.~\ref{eq1}} &\\
&= 2 \\
&\centerwithin{\downarrow}{=} \mbox{using eq.}~\ref{eq2}
\end{flalign*}
\end{minipage}}

\begin{align*}
0 &= 0\\
&\mbox{\hspace*{-\wd\switchbox}\switchocg{ocg1}{\usebox{\switchbox}}\begin{ocg}{OCG 1}{ocg1}{0}
  \usebox{\tempbox}%
  \end{ocg}}\\
& = 3
\end{align*}

\begin{equation}
0
\label{eq0}
\end{equation}

\begin{equation}
1
\label{eq1}
\end{equation}

\begin{equation}
2
\label{eq2}
\end{equation}

\end{document}

这是与文本重叠的变体。请注意,只有 OCG 之后的文本可见。

\documentclass{article}
\usepackage{mathtools}
\usepackage{ocgx}

\newsavebox{\tempbox}% simplify source
\newsavebox{\switchbox}% measure width
\savebox{\switchbox}{\fcolorbox{blue}{red}{\bfseries +}}

\newcommand{\centerwithin}[2]{% #1=small symbol, #2=wide symbol
  {\mathmakebox[\widthof{\ensuremath{{}#2{}}}][c]{{#1}}}}

\begin{document}

\savebox{\tempbox}{\begin{minipage}{\dimexpr\textwidth-\wd\switchbox-0.666ex}%

\abovedisplayskip=0pt
\belowdisplayskip=0pt
\begin{align*}
0 &= 0 \\
&\centerwithin{\downarrow}{=} \text{using eq.~\ref{eq0}} \\
&= 1 \\
&\centerwithin{\downarrow}{=} \mbox{using eq.~\ref{eq1}} \\
&= 2 \\
&\centerwithin{\downarrow}{=} \mbox{using eq.}~\ref{eq2} \\
&= 3
\end{align*}
\end{minipage}}

\begin{flalign*}
&&0 &= 0 &\\
\rlap{\switchocg{ocg1}{\usebox{\switchbox}}\begin{ocg}{OCG 1}{ocg1}{0}
  \smash{\fcolorbox{black}{yellow}{\usebox{\tempbox}}}%
  \end{ocg}} &&&&\\
&&& = 3
\end{flalign*}

\begin{equation}
0
\label{eq0}
\end{equation}

\begin{equation}
1
\label{eq1}
\end{equation}

\begin{equation}
2
\label{eq2}
\end{equation}

\end{document}

相关内容