此刻,我正在思考以下问题。当我使用该twoside
模式写书时,我想打印方程式外部的数字。
我可以使用这两个命令手动修改它:
\makeatletter
\def\LEFTTAG{\tagsleft@true}\def\RIGHTTAG{\tagsleft@false}
\makeatother
这个解决办法很糟糕。
这是一个简单的例子:
\documentclass[a4paper]{book}
\usepackage{multido,lipsum,showframe}
\usepackage{amsmath}
\begin{document}
\chapter{foo}
\multido{\iA=0+1}{10}{%
\lipsum[1]
\begin{align}
x+y
\end{align}}
\end{document}
我如何修改默认环境来打印外部标签?
编辑 相对于 Werner 的答案和以下代码,可能性不太好:
\usepackage{scrextend,etoolbox}
\makeatletter
\preto\set@field{%
\ifthispageodd{\global\tagsleft@false}{\global\tagsleft@true}%
}
\makeatother
答案1
作为解决这个问题的首次尝试,everyshi
包裹很有帮助。在下面的定义中,根据页码是奇数还是偶数来选择左/右标签:
\usepackage{everyshi}% http://ctan.org/pkg/everyshi
\usepackage{xifthen}% http://ctan.org/pkg/xifthen
...
\makeatletter
\EveryShipout{%
\ifthenelse{\isodd{\value{page}}}% Test page number
{\global\tagsleft@true}% Following page will have left-tagged equations
{\global\tagsleft@false}% Following page will have right-tagged equations
}
\makeatother
有一个小问题。每当在页面底部排版一个不完全适合并且必须被打破/刷新到下一页的方程式时,命令\EveryShipout
在修改标签位置(左侧或右侧)时“太晚了”。一种补救措施是进行一些手动干预,以确保将方程式推到下一页后页面被发送出去(例如,通过发布手册\break
或者使用needspace
包裹后者可能更优雅、更自动化,需要定义一个新的环境(使用environ
包裹):
\usepackage{needspace}% http://ctan.org/pkg/needspace
\usepackage{environ}% http://ctan.org/pkg/environ
...
\NewEnviron{altalign}{% Alternating tag align \begin{altalign} ... \end{altalign}
\setbox0=\hbox{% Store contents in box0
\begin{minipage}{\linewidth}\begin{align*}% Unnumbered align
\BODY
\end{align*}\end{minipage}
}%
\Needspace{\ht0}% Need exactly height of box0 at the bottom of the page
\begin{align}
\BODY% Typeset regular tagged align
\end{align}
}
environ
这里包的使用\NewEnviron
至关重要,因为需要捕获环境的主体/内容才能使用它(\BODY
在本例中)。本质上,提供的环境排版环境中altalign
所需的内容(即没有方程编号),嵌入宽度为 的中,并将所有内容存储在一个框中()。然后,发出 ,如果页面上有足够的空间( ),则不执行任何操作,否则,则执行该操作。随后,在传统(编号)环境中排版方程式,这次正确添加了。该解决方案有效,因为环境不会跨页面/列中断,因此可以将其视为单个块/框。align
align*
minipage
\linewidth
box0
\Needspace
\ht0
\break
align
EveryShipout
align