指示条件文本位置的 Changbars

指示条件文本位置的 Changbars

我正在etoolbox按照这个问题使用LaTeX 条件表达式,并希望修改条件以打印某种指示符(如页边空白处的垂直更改条),以显示显示的文本是有条件的且可能会更改。在最终版本中,我打算删除这些更改条,但在此之前,这些指示符将有助于审阅文档。

其他可接受的替代方法是给条件文本加下划线或突出显示,但认为这可能会太分散注意力。

基于在页边空白处添加一个横线我尝试使用changebarframedpdfcomment,但似乎无法让它们工作。我认为使用该framed包不是一个选项,因为这似乎会在段落模式下插入一个新行。我能够让版本changebar在文本模式下工作,但无法让其中任何一个在数学模式下工作。

另外,在 内align*,我可以\iftoggle很好地使用(在其间有一个对齐字符,即作为 的一个参数的一部分\iftoggle),但似乎无法使用具有\iftoggle一些附加功能的宏。

\documentclass[fleqn]{article}

\usepackage{amsmath}
\usepackage{etoolbox}
\usepackage{xcolor}
\usepackage[color]{changebar}
\usepackage{framed}
\usepackage[subject={Top1},author={Peter}]{pdfcomment}

\newtoggle{paper}
\toggletrue{paper}

\newcommand{\MyToggleC}[3]{% Try {changebar} package
    \iftoggle{#1}{%
        \cbcolor{red}\cbstart#2\cbend%
    }{%
        \cbcolor{blue}\cbstart#3\cbend%
    }%
}%


% This seems to insert a new line, so probably can't use this
\newcommand{\MyToggleF}[3]{% Try {framed} package
    \iftoggle{#1}{%
        \begin{leftbar}%
            #2%
        \end{leftbar}%
    }{%
        \begin{leftbar}%
            #3%
        \end{leftbar}%
    }%
}%

\newcommand{\MyToggleP}[3]{% Try {pdfcomment} package
    \iftoggle{#1}{%
        \begin{pdfsidelinecomment}[color=red,icolor=blue,caption=inline,linebegin={/Butt},lineend={/Square},linewidth=2bp,linesep=1cm]{Example}%
            #2%
\end{pdfsidelinecomment}%
    }{%
        \begin{pdfsidelinecomment}[color=red,icolor=red,caption=inline,linebegin={/Butt},lineend={/Square},linewidth=2bp,linesep=1cm]{Example}%
            #3%
        \end{pdfsidelinecomment}%
    }%
}%

    \begin{document}

    % This part works only with the {changebar} version: \MyToggleC
    This document is intended for 
    \MyToggleC{paper}{paper}{electronic}
    distribution.

    % Can't get this to work with any version (ie can't get any change bars to show)
    \begin{align*}
        a &= b\\
        \MyToggleC{paper}{c}{}&\MyToggleC{paper}{= d}{}\\
        e &= f\\
    \end{align*}

    % But would prefer something like this as this won't leave a blank line
    % if the toggle is disabled. This now works with the updated \MyToggleC
    % but the changebars are not shown.
    \begin{align*}
        a &= b\\
        \MyToggleC{paper}{
            c &= d\\
        }{}
        e &= f\\
    \end{align*}

This should highlight the first two lines, not just the first line
\begin{align*}
f(x)=
    \begin{cases}
        \MyToggleT{paper}{
        -1  &\text{ for } x < 0\\
        0   &\text{ for } x = 0\\
        }{}
        1   &\text{ for } x > 0
    \end{cases}
\end{align*}

This should highlight four lines of this, not just one
\begin{align*}
f(x)
        &={-\frac{7}{1.5} -{1}}+{\frac{7}{3}-{5}}\\
\MyToggleT{paper}{
        &= -\frac{14}{3} -\frac{3}{3} +\frac{7}{3}-\frac{15}{3}\\
        &=-\frac{17}{3}            -\frac{8}{3}\\
        &=\frac{-17-8}{3}\\         &=\frac{-25}{3}\\
}{}
        &=-8\frac{1}{3}
\end{align*}

\end{document}

2011-07-15 更新:宏 \MyToggleC 已更改为使用宏而不是环境changebar。这似乎有效,更好的是条件文本可以正确显示,但仍然无法让更改栏显示在环境中align。所以,现在看来我唯一的问题是让更改栏显示在数学环境中。

理想情况下,我更希望有一个宏,例如\ifpaper,它既接受一个参数,又能够打印基于文本的文本,而不必为子句\ifelectronic留空。特别重要的是,在环境中,只有特定的行会被标记,而不是整个环境。{}elsealignalign

2011-07-21 更新

提供的解决方案似乎效果很好,但前提是先在文本模式下使用,然后再在数学模式下使用。如果不先在文本模式下使用,更改指示器会在第二次运行时消失(它们在第一次运行时显示,但不在第二次运行时显示)。在下面的 MWE 示例中,第二次运行时看起来很棒,但如果注释掉,情况就不一样了def\PrintTextLineWithChanges

\documentclass[fleqn]{article}

\usepackage{amsmath}
\usepackage{etoolbox}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,fit}

\newlength\togglelen
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {\vphantom{X}};}
\makeatletter
\newcommand{\MyToggleT}{\@ifstar\MyToggleTT\MyToggleTN}
\newcommand{\MyToggleTN}[3]{%
    \setlength{\togglelen}{\hoffset}%
    \addtolength{\togglelen}{1in}%
    \addtolength{\togglelen}{\oddsidemargin}%
    \addtolength{\togglelen}{\leftskip}%
    \iftoggle{#1}{%
      \tikzmark{first}#2\tikzmark{second}%
      \begin{tikzpicture}[remember picture,overlay]
        \coordinate (one) at ($(first.north -| current page.south west)+(\togglelen,0)$);
        \coordinate (two) at ($(second.south -| current page.south west)+(\togglelen,0)$);
        \node[fit=(one) (two),fill=red,minimum width=3pt,inner
        sep=0pt,anchor=base east] {};
      \end{tikzpicture}%
    }{%
      \tikzmark{first}#3\tikzmark{second}%
      \begin{tikzpicture}[remember picture,overlay]
        \coordinate (one) at ($(first.north -| current page.south west)+(\togglelen,0)$);
        \coordinate (two) at ($(second.south -| current page.south west)+(\togglelen,0)$);
        \node[fit=(one) (two),fill=blue,minimum width=3pt,inner
        sep=0pt,anchor=base east] {};
      \end{tikzpicture}%
    }%
}%
\newcommand{\MyToggleTT}[3]{\MyToggleTN{#1}{#2}{#3}\\}%
\makeatother



\newtoggle{paper}
\toggletrue{paper}

\def\PrintTextLineWithChanges{}%  Nothing gets flagged with this commented.

\begin{document}
The lines with an $\oplus$ should be flagged.

\ifdefined\PrintTextLineWithChanges
    Need text to use the MyToggleT macro here
    otherwise things don't work
    \MyToggleT{paper}{some text}{some other text}
\fi


\begin{align*}
f(x)=
    \begin{cases}
        \MyToggleT*{paper}{
        -1  &\text{ for } x < 0 \oplus\\
        0   &\text{ for } x = 0 \oplus
        }{}
        1   &\text{ for } x > 0
    \end{cases}
\end{align*}

This should highlight four lines indicated with $\oplus$
\begin{align*}
f(x)
        &= a\\
\MyToggleT*{paper}{
        &= b\oplus\\
        &= c\oplus\\
        &= d\oplus\\
        &= e\oplus
}{}
        &=f
\end{align*}

\end{document}

答案1

以下版本使用 TikZ 工作,并且适用于数学模式和文本。想法是使用[remember picture,overlay]的选项tikzpicture,这样 1) 不会占用文本行中的空间,并且 2) 允许您使用节点current page

\usepackage{tikz}
\usetikzlibrary[calc,fit]
\newlength\togglelen
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {\vphantom{X}};}
\makeatletter
\newcommand\changebar[2]{%
  \begin{tikzpicture}[remember picture,overlay]
    \coordinate (one) at ($(first.north -| current page.south west)+(#1,0)$);
    \coordinate (two) at ($(second.south -| current page.south west)+(#1,0)$);
    \node[fit=(one) (two),fill=#2,minimum width=3pt,inner sep=0pt,anchor=base east] {};
  \end{tikzpicture}%
}
\newcommand{\MyToggleT}{\@ifstar\MyToggleTT\MyToggleTN}
\newcommand{\MyToggleTN}[3]{%
  \setlength{\togglelen}{\hoffset}%
  \addtolength{\togglelen}{1in}%
  \addtolength{\togglelen}{\oddsidemargin}%x
  \addtolength{\togglelen}{\leftskip}%
  \global\edef\temp{\the\togglelen}%  THIS IS A HACK TO AVOID GROUPING PROBLEMS WITH &
  \iftoggle{#1}{%
    \tikzmark{first}#2\tikzmark{second}%
    \expandafter\changebar\expandafter{\temp}{red}%
  }{%
    \tikzmark{first}#3\tikzmark{second}%
    \expandafter\changebar\expandafter{\temp}{blue}%
  }%
}%

\newcommand{\MyToggleTT}[3]{\MyToggleTN{#1}{#2}{#3}\\}%
\makeatother

使用此宏需要两次编译才能达到稳定的输出。请注意,如果您设置了\togglefalse{paper},则第二个示例将产生一个空白行,因为\\未包含在MyToggleT宏中……但更改栏仍将正确显示。

2011 年 7 月 16 日更新:根据问题中的新挑战,更改栏不仅需要指示第一行条件,而是所有条件。但就问题而言,我认为不可能准确检测出论点的高度,因为\\包含在您的论点中,如果您将其排除,则空白链接将始终出现。

更新日期:7-20-11:添加了一个简单的星号变体,可以为您插入\\,这样您就可以更精确地估计高度(事实证明,我之前遇到的错误是由于忘记了\makeatlettertex 文档的序言而不是样式文件的序言......)

无论如何,上述版本都会生成多行高的更改栏。它使用 Martin Scharrer 的\tikzmark宏来标记参数前后的坐标,然后绘制一个适合它们的更改栏。因此,此版本不如前一个版本健壮,如果参数排版为跨越页面边界,则会失败。

2011 年 7 月 22 日更新:宏似乎已损坏,因为\togglelen长度被重置为0.0pt。经过一番挖掘,这似乎是因为&数学参数中的\MyToggleT。请参阅这个答案简短而精辟地解释一下 的&实际作用... 我无法通过将参数包装在一个组中来解决这个问题,因为这会破坏数学模式。因此,我改用\global\edef\temp{\the\togglelen},虽然不是最优的,但可以避开这个问题。

相关内容