按偶数/奇数页枚举项目标签位置

按偶数/奇数页枚举项目标签位置

我有一个KOMA-script 双面文档和一个enumerate环境(来自包enumitem),其项目标签位于文本主体之外。

我想要的是所有项目标签都在外页一侧,因此对于奇数页来说位于文本的右侧。

考虑以下 MWE:

\documentclass[a4paper,twoside]{scrreprt}
\usepackage[inline]{enumitem}
\usepackage{lipsum}  

\newenvironment{enumerateWithCode}[1]
{%
    \begin{enumerate}[
        leftmargin=0em,
        label={\small\textbf{#1.\arabic*)}},
        ref=#1.\arabic*]
}{%
    \end{enumerate}%
}

\begin{document}

\begin{enumerateWithCode}{RIGHT}
    \item \lipsum[1]
    \item \lipsum[1]
\end{enumerateWithCode}
\clearpage
\begin{enumerateWithCode}{LEFT}
    \item \lipsum[1]
    \item \lipsum[1]
\end{enumerateWithCode}

\end{document}

在此处输入图片描述

使用环境labelsep=\theEnumerateWithCodeLabelSep选项

\newcommand{\theEnumerateWithCodeLabelSep}{%
    \dimexpr -5.5em -\textwidth\relax%
}

确实将项目标签移动到右侧(由于-\textwidth),但这意味着每当项目列表扩展多页时,我必须手动放置单独的环境。

在此处输入图片描述

因此我尝试使用 KOMA 脚本\Ifthispageodd

\newcommand{\theEnumerateWithCodeLabelSep}{%
    \Ifthispageodd{%
        \dimexpr -5.5em -\textwidth\relax%
    }{%
        .5em%
    }%
}

和包装ifoddpage

\newcommand{\theEnumerateWithCodeLabelSep}{%
    \checkoddpage%
    \ifoddpage%
    \dimexpr -5.5em -\textwidth\relax%
    \else%
    .5em%
    \fi%
}

动态/有条件地定义 labelsep 值,但由于编译错误而没有成功。

注意:无论何时,这可能有效,我还想控制标签来更改使用的括号。

最终解决方案根据 user691586 接受的答案

使用不带括号的标签使其在偶数页和奇数页上都能正常工作,并使它们的文本长度相同,从而为文本主体提供大致相等的间距

\newcommand{\theEnumerateWithCodeLabelSep}{%
    \Ifthispageodd{\labelsep\dimexpr -2.1em -\labelwidth -\textwidth\relax}%
                  {\labelsep -.25em}%
}
% hacky solution for left and right alignment working on even and odd pages
\SetLabelAlign{enumerateWithCodeAlign}{\hss\llap{#1}\hfil} 
\newenvironment{enumerateWithCode}[1]
{%
    \let\originalitem\item%
    \def\item{%
        \Needspace*{\baselineskip}%
        \theEnumerateWithCodeLabelSep%
        \originalitem%
    }%
    \begin{enumerate}[
        leftmargin=0em,
        align=enumerateWithCodeAlign,
        label={\small\textbf{#1.\arabic*}},
        ref=#1.\arabic*] %% or \alph*
}{%
    \end{enumerate}%
    \def\item{\originalitem}%
}

答案1

查看代码注释

\documentclass[a4paper,twoside]{scrreprt}
\usepackage[inline]{enumitem}
\usepackage{lipsum}  
\usepackage{needspace}
\newcommand{\updatelabelsep}{%
    \Ifthispageodd{\labelsep\dimexpr\itemindent-\labelwidth-\linewidth\relax}%
                  {\labelsep 0.5em}%
}
\newenvironment{enumerateWithCode}[1]
{%
    % maybe safe as long as not using * variants (inline) of enumerate
    \let\originalitem\item
    \def\item{\par
            % make sure this item has room, if not clear page while
            % keeping flushbottom in effect, so that the reference
            % inserted by \Ifthispageodd will be at top of next page
            % and the test of page parity on second LaTeX pass will be ok
            \Needspace*{\baselineskip}% maybe .5\baselineskip actually enough
            \updatelabelsep
            \originalitem
            }%
    \begin{enumerate}[%
        leftmargin=0em,
        label={\small\textbf{#1.\arabic*)}},
        ref=#1.\arabic*,
        labelwidth=6em,% make it large enough
        % itemindent=2em, % only to test
        ]
}{%
    \end{enumerate}%
}

\begin{document}
Skip to bottom
\vspace*{\dimexpr\textheight-4\baselineskip\relax}
\begin{enumerateWithCode}{ABCDE}
    \item random text
    \item random text
    \item random text
    \item random text
    \item random text
    \item random text
\end{enumerateWithCode}

\end{document}

带有分页符和页边距标签的列表

(第一和第二个版本已过时)

(第二个版本,略好一些)

尝试这个

\documentclass[a4paper,twoside]{scrreprt}
\usepackage[inline]{enumitem}
\usepackage{lipsum}  

\newcommand{\updatelabelsep}{%
    \Ifthispageodd{\labelsep\dimexpr -5.5em -\textwidth\relax}%
                  {\labelsep .5em }%
}
\newenvironment{enumerateWithCode}[1]
{%
    \begin{enumerate}[%
        leftmargin=0em,
        label={\small\textbf{#1.\arabic*)}},
        ref=#1.\arabic*,
        ]
}{%
    \end{enumerate}%
}

\begin{document}

\begin{enumerateWithCode}{ABCDE}
    \updatelabelsep\item \lipsum[1]
    \updatelabelsep\item \lipsum[1]
    \updatelabelsep\item \lipsum[1]
    \updatelabelsep\item \lipsum[1]
    \updatelabelsep\item \lipsum[1]
    \updatelabelsep\item \lipsum[1]
\end{enumerateWithCode}
\clearpage
\begin{enumerateWithCode}{FGHIJ}
    \updatelabelsep\item \lipsum[1]
    \updatelabelsep\item \lipsum[1]
\end{enumerateWithCode}

\end{document}

在此处输入图片描述

如果您不想手动添加,\updatelabelsep您可以尝试序言末尾的部分:

\let\originalitem\item
\def\item{\updatelabelsep\originalitem}

\updatelabelsep然后删除上面代码中所有出现的。

这看起来有点危险(我\let\item\enit@endinboxenumitem源代码中看到了两个,但没有仔细搜索过这些代码),但至少这里似乎有效。使用时风险自负。

(初始答案)

尝试这个

\documentclass[a4paper,twoside]{scrreprt}
\usepackage[inline]{enumitem}
\usepackage{lipsum}  
%\usepackage{ifoddpage}

\newdimen\mydimen
\newenvironment{enumerateWithCode}[1]
{%
    \Ifthispageodd{\mydimen \dimexpr -5.5em -\textwidth\relax}%
                  {\mydimen .5em }%
    \begin{enumerate}[%
        leftmargin=0em,
        label={\small\textbf{#1.\arabic*)}},
        ref=#1.\arabic*,
        labelsep=\mydimen
        ]
}{%
    \end{enumerate}%
}

\begin{document}

\begin{enumerateWithCode}{RIGHT}
    \item \lipsum[1]
    \item \lipsum[1]
\end{enumerateWithCode}
\clearpage
\begin{enumerateWithCode}{LEFT}
    \item \lipsum[1]
    \item \lipsum[1]
\end{enumerateWithCode}

\end{document}

我认为\Ifthispageodd它不能仅通过扩展来工作,因此它不能用作labelsep键值,因为这最终会导致 enumitem 分配某些维度(或跳过,未检查)。所以我在实际调用 enumitem 环境之前使用它。

但请注意,如果有多个项目,则环境起始的页面的奇偶校验将起作用。

为了修复这个问题,人们可能可以这样做,但可能需要了解 enumitem 如何实现 labelsep 的细节;我没有这样做,以避免出现太过复杂的解决方案。

(过时版本结束)

相关内容