我正在etoolbox
按照这个问题使用LaTeX 条件表达式,并希望修改条件以打印某种指示符(如页边空白处的垂直更改条),以显示显示的文本是有条件的且可能会更改。在最终版本中,我打算删除这些更改条,但在此之前,这些指示符将有助于审阅文档。
其他可接受的替代方法是给条件文本加下划线或突出显示,但认为这可能会太分散注意力。
基于在页边空白处添加一个横线我尝试使用changebar
、framed
和pdfcomment
,但似乎无法让它们工作。我认为使用该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
留空。特别重要的是,在环境中,只有特定的行会被标记,而不是整个环境。{}
else
align
align
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:添加了一个简单的星号变体,可以为您插入\\
,这样您就可以更精确地估计高度(事实证明,我之前遇到的错误是由于忘记了\makeatletter
tex 文档的序言而不是样式文件的序言......)
无论如何,上述版本都会生成多行高的更改栏。它使用 Martin Scharrer 的\tikzmark
宏来标记参数前后的坐标,然后绘制一个适合它们的更改栏。因此,此版本不如前一个版本健壮,如果参数排版为跨越页面边界,则会失败。
2011 年 7 月 22 日更新:宏似乎已损坏,因为\togglelen
长度被重置为0.0pt
。经过一番挖掘,这似乎是因为&
数学参数中的\MyToggleT
。请参阅这个答案简短而精辟地解释一下 的&
实际作用... 我无法通过将参数包装在一个组中来解决这个问题,因为这会破坏数学模式。因此,我改用\global\edef\temp{\the\togglelen}
,虽然不是最优的,但可以避开这个问题。