是否可以使用 取消缩进插入的代码\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
有一种方法可以使用类似于gobble
with 的方法lstinputlistings
,即使用xkeyval
包。这个想法基于在此回答相关问题。
基本思想是使用 将整个内容向左移动xleftmargin
,并通过 调整数字的位置numbersep
。首先,我们定义一个命令,它只保存传递给basicstyle
lstlistings 键的参数
\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
,所以我不确定整个结构有多稳定。