我有一个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@endinbox
在enumitem
源代码中看到了两个,但没有仔细搜索过这些代码),但至少这里似乎有效。使用时风险自负。
(初始答案)
尝试这个
\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 的细节;我没有这样做,以避免出现太过复杂的解决方案。
(过时版本结束)