使用 \lstinputlisting 插入取消缩进的代码

使用 \lstinputlisting 插入取消缩进的代码

是否可以使用 取消缩进插入的代码\lstinputlisting?特别是我希望能够通过固定数量的空格取消缩进。

我需要在操作系统脚本课程中编写一个关系,并且我想包含一些bash脚本的源代码。我注意到它gobble被忽略了,\lstinputlisting但我想避免手动复制粘贴代码并取消缩进。有没有什么解决方案?

答案1

根据listings文档,这是不可能的:

我可以将 'gobble' 与 '\lstinputlisting' 一起使用吗?可以,但是没有效果。

minted另一方面,该包将gobble使用

\inputminted[gobble=n,...]{language}{file}

请注意,在这种情况下,minted包将删除输入文件每行的前 n 个字符,无论这些字符是否是空格。

答案2

fancyvrb可以处理gobble选项

\documentclass{article}
\usepackage{fancyvrb}

     \begin{document}
     \VerbatimInput[gobble=4]{\jobname.tex}
     \end{document}

答案3

有一种方法可以使用类似于gobblewith 的方法lstinputlistings,即使用xkeyval包。这个想法基于在此回答相关问题。

基本思想是使用 将整个内容向左移动xleftmargin,并通过 调整数字的位置numbersep。首先,我们定义一个命令,它只保存传递给basicstylelstlistings 键的参数

\def\lsttextstyle{\footnotesize\ttfamily}

这用于定义保存特定文本格式中空格长度的新长度(在部分中再次使用\lstset

\newlength{\myspace}
\settowidth{\myspace}{\lsttextstyle{\ }}

另外,还需要以下宏的长度

\newlength{\mytemp}
\newlength{\mytempb}

然后使用包xkeyval我们定义一个名为的新键xgobble

\makeatletter
  \define@key{lst}{xgobble}{%
    \setlength{\mytemp}{\lst@xleftmargin}
    \addtolength{\mytemp}{-#1\myspace}
    \def\lst@xleftmargin{\mytemp}%
    \setlength{\mytempb}{\lst@numbersep}
    \addtolength{\mytempb}{-#1\myspace}
    \def\lst@numbersep{\mytempb}%
  }
\makeatother

使用当前值减去一个空格的长度乘以xleftmargin传递\mytemp给 xgobble 的值,并将结果写回到xleftmargin整个代码,将其向左移动。numbersep将数字移回右侧(其原始位置)也做了类似的事情。

它可以简单地像

\lstinputlisting[xgobble=<value>]{sourcecode.file}

以下是完整的 MWE

\documentclass{scrartcl}

\usepackage{listings}
\usepackage{xkeyval}

\def\lsttextstyle{\footnotesize\ttfamily}

\lstset{
  language=bash,
  xleftmargin=4\myspace,
  basicstyle=\lsttextstyle,
  numbers=left,
  numbersep=2\myspace
}

\newlength{\myspace}
\settowidth{\myspace}{\lsttextstyle{\ }}

\newlength{\mytemp}
\newlength{\mytempb}

\makeatletter
\define@key{lst}{xgobble}{%
  \setlength{\mytemp}{\lst@xleftmargin}
  \addtolength{\mytemp}{-#1\myspace}
  \def\lst@xleftmargin{\mytemp}%
  \setlength{\mytempb}{\lst@numbersep}
  \addtolength{\mytempb}{-#1\myspace}
  \def\lst@numbersep{\mytempb}%
}
\makeatother

\begin{document}
This is the normal code of the full script
\begin{verbatim}
\lstinputlisting{testcode.sh}
\end{verbatim}
\lstinputlisting{testcode.sh}
now the echo part without indentation
\begin{verbatim}
\lstinputlisting[linerange={6-8}]{testcode.sh}
\end{verbatim}
\lstinputlisting[linerange={6-8}]{testcode.sh}
and now three examples with indentation 
\begin{verbatim}
\lstinputlisting[linerange={6-8},xgobble=2]{testcode.sh}
\lstinputlisting[linerange={7-8},xgobble=4]{testcode.sh}
\lstinputlisting[linerange={7-8},xgobble=0]{testcode.sh}
\end{verbatim}
\lstinputlisting[linerange={6-8},xgobble=2]{testcode.sh}
\lstinputlisting[linerange={7-8},xgobble=4]{testcode.sh}
\lstinputlisting[linerange={7-8},xgobble=0]{testcode.sh}

\end{document}

... 示例 bash 脚本可能根本不起作用:

#!/bin/bash

echo "Hello World!"

if ( whatever ) ; 
  echo "this"
    echo "is"
      echo "indented"
      echo "and this is an incredible long line to check if linebreaking still works fine"
fi

由于我对此几乎一无所知xkeyval,所以我不确定整个结构有多稳定。

相关内容