根据奇数/偶数页对标题进行不规则对齐

根据奇数/偶数页对标题进行不规则对齐

恢复我早已忘却的 LaTex 知识,非常感谢您能帮助我实现页边距标题的左对齐或右对齐,具体取决于我们所在的页面。我认为这可能不像我想象的那么简单,而且在布局页面时,LaTex 的信息有一定的依赖性,但不确定。请查看下面的示例

\documentclass[twoside]{scrartcl}
\usepackage[outer=7cm, inner=3cm, marginparwidth=4cm, marginparsep=10mm]{geometry}

\usepackage[top]{mcaption}
\usepackage[font=footnotesize,normal]{caption}          
\usepackage{graphicx}                                                               
\usepackage{mwe}                                                                 

\DeclareCaptionJustification{raggedauto}{\ifodd\thepage \raggedright \else \raggedleft \fi}
\captionsetup{labelfont={bf}, font={it,footnotesize}, justification=raggedauto, singlelinecheck=false, position=above}

\begin{document}

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-a}
  \end{margincap}
  \end{figure}

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-b}
  \end{margincap}
  \end{figure}

  \newpage

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-c}
  \end{margincap}
  \end{figure}

\end{document}

我得到: 在此处输入图片描述

在此处输入图片描述

如您所见,我仅在 C 上获得了我想要的正确效果,因为我强制使用了 \newpage。在我的原始文件中,其他类型的部分似乎也正确地重置了“页面侧”。我可以更改什么来自动更正图片 B?谢谢

答案1

欢迎来到 TeX.SE!

当 TeX 处理浮动材料(在figure环境中)时,它会扩展\thepage到当前正在处理的页面的编号。但是,根据 LaTeXtablefigure环境等浮动的定义,此材料可能会浮动到另一页。但是一旦打包到图中(在 TeX 读取它之后,但在决定将其放在哪里之前),您使用的材料\thepage就会已经扩大,类似于 TeX 处理完一个\hbox或一个\vbox命令后得到的结果。结果,你的\ifodd条件不再存在,两个代码路径中的一个被保留,另一个被丢弃,所有这些我们知道浮动材料最终会被放在哪里。确切地说,条件\ifodd已经根据 TeX 读取figure材料时正在处理的页面进行了扩展,而不是根据最终将排版该材料的页面进行了扩展。

esdd 为您提供了一个使用 KOMA-Script 命令的解决方案。这是另一个适用于任何类的解决方案。它使用带有选项的changepagestrict。加载包后,您唯一要做的就是\DeclareCaptionJustification{raggedauto}{...}像这样更改您的:

\DeclareCaptionJustification{raggedauto}{%
  \checkoddpage
  \ifoddpage \raggedright \else \raggedleft \fi
}

这里避免上述问题的技巧是,\checkoddpage自动将标签放置在使用的位置,并根据此标签中的页码而不是 TeX 在读取此材料时处理的页码进行操作。因此,标签保存的是最近一次编译运行后浮动的\ifoddpage页码, 1正是您想要的。完整代码:figure

\documentclass[twoside]{scrartcl}
\usepackage[strict]{changepage}
\usepackage[outer=7cm, inner=3cm, marginparwidth=4cm,
            marginparsep=10mm]{geometry}

\usepackage[top]{mcaption}
\usepackage[font=footnotesize,normal]{caption}
\usepackage{graphicx}
\usepackage{mwe}

\DeclareCaptionJustification{raggedauto}{%
  \checkoddpage
  \ifoddpage \raggedright \else \raggedleft \fi
}
\captionsetup{labelfont={bf}, font={it,footnotesize},
              justification=raggedauto, singlelinecheck=false, position=above}

\begin{document}

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-a}
  \end{margincap}
  \end{figure}

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-b}
  \end{margincap}
  \end{figure}

  \newpage

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-c}
  \end{margincap}
  \end{figure}

\end{document}

在第 1 页:

第 1 页


在第 2 页:

第2页


脚注

  1. 通常,两次编译运行就足以获得稳定的标签;当需要更多编译时,LaTeX 会发出警告,您可能也知道。

答案2

KOMA-Script 课程提供\Ifthispageodd


\documentclass[twoside]{scrartcl}
%\providecommand*\Ifthispageodd{\ifthispageodd}% needed up to and including KOMA-Script version 3.27, see https://komascript.de/faq_deprecatedif
\usepackage[outer=7cm, inner=3cm, marginparwidth=4cm, marginparsep=10mm]{geometry}

\usepackage[top]{mcaption}
\usepackage[font=footnotesize,normal]{caption}
\usepackage{graphicx}
\usepackage{mwe}                                                                

\DeclareCaptionJustification{raggedauto}{\Ifthispageodd{\raggedright}{\raggedleft}}% <- changed
\captionsetup{labelfont={bf}, font={it,footnotesize}, justification=raggedauto, singlelinecheck=false, position=above}

\begin{document}

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-a}
  \end{margincap}
  \end{figure}

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-b}
  \end{margincap}
  \end{figure}

% \newpage% <- not needed

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-c}
  \end{margincap}
  \end{figure}

\end{document}

运行两次即可获得

在此处输入图片描述


软件包scrextend还提供\Ifthispageodd。因此,你可以将其与标准班, 也:

\documentclass[twoside
  ,11pt% <- added, same fontsize as default for KOMA-Script classes
]{article}
\usepackage{scrextend}% <- added, provides \Ifthispageodd
%\providecommand*\Ifthispageodd{\ifthispageodd}% needed up to and including KOMA-Script version 3.27, see https://komascript.de/faq_deprecatedif
\usepackage[outer=7cm, inner=3cm, marginparwidth=4cm, marginparsep=10mm]{geometry}

\usepackage[top]{mcaption}
\usepackage[font=footnotesize,normal]{caption}
\usepackage{graphicx}
\usepackage{mwe}

\DeclareCaptionJustification{raggedauto}{\Ifthispageodd{\raggedright}{\raggedleft}}% <- changed
\captionsetup{labelfont={bf}, font={it,footnotesize}, justification=raggedauto, singlelinecheck=false, position=above}

\begin{document}

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-a}
  \end{margincap}
  \end{figure}

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-b}
  \end{margincap}
  \end{figure}

% \newpage% <- not needed

  \begin{figure}[htb]
  \begin{margincap}
      \caption{This is my caption}
      \includegraphics[width=\textwidth]{example-image-c}
  \end{margincap}
  \end{figure}

\end{document}

相关内容