Usando \leftskip como xleftmargin

Usando \leftskip como xleftmargin

Estou compondo texto com vários saltos para a esquerda (algumas seções do texto são recuadas para a direita).

Por alguma razão, as listagens não levam em conta o leftskip por padrão. No entanto, possui uma propriedade xleftmargin que é interessante. Funciona adequadamente quando recebe um valor explícito, por exemplo. 2cm.

No entanto, não consigo defini-lo como igual a \leftskip. Eu tentei diferentes variações, incluindo

\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}

Mas sem sucesso. O que deveria dizer ? No MWE eu poderia usar apenas 5cm, mas na realidade \leftskip nem sempre será o mesmo.

Responder1

Aloque um novo comprimento que é definido \leftskipantes lstlistingde funcionar; então podemos usá-lo como valor para 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}

insira a descrição da imagem aqui

Responder2

Como Ulrike Fischer apontou em seu comentário, \leftskipé redefinido por \begin{lstlisting}.

O mais próximo que consegui foi criar um segundo registro de comprimento com o mesmo valor e usá-lo. Isso significaria que você teria que atualizar esse registro cada vez que mudar \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}

informação relacionada