我在文档中使用 KOMA 脚本。有时,我有一个比文本宽度宽的浮点数,我想让浮点数被推入外边距。这就是我定义\widefloat
命令的原因,它使用命令检查页面是否为奇数\ifthispageodd
,并根据结果将浮动向左或向右推。当浮动位于页面中间时,此方法可以正常工作。但是,当浮动被扔到下一页时,\ifthispageodd
会产生错误的结果。你能告诉我如何解决这个问题吗?
MWE:第一个浮点数被正确地推入外边缘,第二个浮点数被推入内边缘。
\documentclass[11pt]{scrbook}
\usepackage{tikz,lipsum}
\newcommand{\widefloat}[1]{%
\ifthispageodd{\makebox[\textwidth][l]{#1}}{\makebox[\textwidth][r]{#1}}}
\begin{document}
\lipsum[1]
\widefloat{
\begin{tikzpicture}
\draw (0,0) rectangle (16cm,10cm);
\end{tikzpicture}}
\lipsum[3]
\widefloat{
\begin{tikzpicture}
\draw (0,0) rectangle (16cm,10cm);
\end{tikzpicture}}
\lipsum[2]
\end{document}
答案1
问题出现是因为\ifthispageodd
首先将 写入\label
文件.aux
,然后(本质上)执行\pageref
标签的 以获取当前页面。不幸的是,标签和引用可能会彼此分离,并且与您正在放置的图形分离。防止这种情况的一种方法是将整个内容包装在 中\mbox
:
\newcommand{\widefloat}[1]{%
\mbox{%
\ifthispageodd%
{%
\makebox[\textwidth][l]{#1}%
}{%
\makebox[\textwidth][r]{#1}
}
}%
}
您可能还想将其放在\noindent
前面\mbox
以获得适当的边距对齐。
答案2
出现这种情况是因为当发出第二个时\widefloat
,页面仍然是奇数......
将其定义为
\newcommand{\widefloat}[1]{%
\setlength{\alength}{\textheight-\pagetotal}%
\setlength{\blength}{\totalheightof{\parbox{\linewidth}{#1}}}%
\ifdim\alength<\blength\clearpage\fi%
\ifthispageodd{\noindent\makebox[\textwidth][l]{#1}}{\noindent\makebox[\textwidth][r]{#1}}%
}
并添加
\usepackage{calc}
\newlength{\alength}
\newlength{\blength}
在你的序言中,这样你的 MWE 就变成了
\documentclass[11pt]{scrbook}
\usepackage{tikz,lipsum}
\usepackage{calc}
\newlength{\alength}
\newlength{\blength}
\newcommand{\widefloat}[1]{%
\setlength{\alength}{\textheight-\pagetotal}%
\setlength{\blength}{\totalheightof{\parbox{\linewidth}{#1}}}%
\ifdim\alength<\blength\clearpage\fi%
\ifthispageodd{\noindent\makebox[\textwidth][l]{#1}}{\noindent\makebox[\textwidth][r]{#1}}%
}
\begin{document}
\lipsum[1]
\widefloat{%
\begin{tikzpicture}
\draw (0,0) rectangle (16cm,10cm);
\end{tikzpicture}}
\lipsum[3]
\widefloat{%
\begin{tikzpicture}
\draw (0,0) rectangle (16cm,10cm);
\end{tikzpicture}}
\lipsum[2]
\end{document}
输出: