使用 \leftskip 作为 xleftmargin

使用 \leftskip 作为 xleftmargin

我正在排版具有不同 leftskip 的文本(文本的某些部分向右缩进)。

由于某种原因,listings 默认不考虑 leftskip。但是它有一个有趣的 xleftmargin 属性。当给定一个明确的值(例如 2cm)时,它可以正常工作。

但是,我似乎无法将其设置为等于 \leftskip。我尝试了不同的变体,包括

\documentclass{article}

\usepackage{listings}
\setlength{\leftskip}{5cm}

\begin{document}

totototo

\begin{lstlisting}[xleftmargin={\the\leftskip}]
def example_function():
    print("Hello, world!")
\end{lstlisting}


\end{document}

但无济于事。我该说什么?在 MWE 中我可以使用5cm,但实际上, \leftskip 并不总是相同的。

答案1

\leftskip分配一个新的长度,在其工作之前设置为lstlisting;然后我们可以将它用作的值xleftmargin

\documentclass{article}
\usepackage{listings}

\newlength{\keepleftskip}

\AtBeginEnvironment{lstlisting}{\setlength{\keepleftskip}{\leftskip}}
\lstset{xleftmargin=\keepleftskip}

\begin{document}

\noindent
totototo

\begin{lstlisting}
def example_function():
    print("Hello, world!")
\end{lstlisting}

\setlength{\leftskip}{5cm}

\noindent
totototo

\begin{lstlisting}
def example_function():
    print("Hello, world!")
\end{lstlisting}

\setlength{\leftskip}{1cm}

\noindent
totototo

\begin{lstlisting}
def example_function():
    print("Hello, world!")
\end{lstlisting}

\end{document}

在此处输入图片描述

答案2

正如 Ulrike Fischer 在她的评论中指出的那样,\leftskip被重置\begin{lstlisting}

我能想到的最接近的方法是创建具有相同值的第二个长度寄存器并使用该寄存器。这意味着每次更改时都必须更新该寄存器\leftskip

\documentclass{article}

\usepackage{listings}
\newlength{\leftskiphack}

\begin{document}

\setlength{\leftskip}{5cm}
\setlength{\leftskiphack}{\leftskip}

totototo

\begin{lstlisting}[xleftmargin=\the\leftskiphack]
def example_function():
    print("Hello, world!")
\end{lstlisting}

\setlength{\leftskip}{8cm}
\setlength{\leftskiphack}{\leftskip}

totototo

\begin{lstlisting}[xleftmargin=\the\leftskiphack]
def example_function():
    print("Hello, world!")
\end{lstlisting}

\end{document}

相关内容