格式化列表

格式化列表

我论文中的列表是 Java 代码。当通过 TeX 显示时,我会丢失我在 .java 文件中进行的一些格式设置。例如,我代码中的所有注释都是对齐的,但现在在 TeX 中合并 Java 代码后,注释不再对齐。以下是此困境的视觉图:

在此处输入图片描述

注意除了顶部的几条评论外,其他所有评论都是排列整齐的。显然,右侧还有空间可以移动所有评论。

以下是该列表的 TeX 代码:

\section{Code}


\lstset{language=Java, basicstyle=\tiny\ttfamily,
    linewidth=\textwidth,
    numbers=left,
    columns=flexible,
    numbersep=5pt,      % Abstand der Nummern zum Text
    tabsize=3,
    breaklines=true,
    frame=bottomline,
    showspaces=false,
    showtabs=false,
    xleftmargin=17pt,
    breakatwhitespace=true,
    framexleftmargin=17pt,
    framexrightmargin=5pt,
    framexbottommargin=4pt,
    showstringspaces=false,
    literate=%
        {Ö}{{\"O}}1
        {Ä}{{\"A}}1
        {Ü}{{\"U}}1
        {ß}{{\ss}}2
        {ü}{{\"u}}1
        {ä}{{\"a}}1
        {ö}{{\"o}}1
        }
\lstinputlisting{EncodingScheme.JAVA}
  1. 有没有办法可以手动编辑 TeX 内部的代码?
  2. 如何在代码中的特定点获取分页符?例如,如果我想在图片中看到页面底部的 for 循环,我该怎么做?
  3. 请提供所有与 TeX 内部格式化代码相关的建议。

答案1

如果你的注释在源代码中对齐,但在lstlisting环境中却不对齐,原因通常是源代码中有制表符和空格您的源代码编辑器的 TAB 宽度与 使用的 TAB 宽度不一致listings。您可以使用选项更改后者tabsize=<number>

不过,也可以自动对齐所有注释。在下面,我用 覆盖//分隔符,以便morecomment使用命令“格式化”注释\lstCom[<indent length>]。该\lstCom命令使用tabto包将所有注释排版到左侧的固定位置,无论源代码是什么样子,注释都能完美对齐:

\documentclass[DIV=15]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{listings,beramono,helvet}
\usepackage{tabto}

\makeatletter
\newenvironment{lstComment}[1][]
{\begingroup\def\lst@com@width{#1}\begin{lrbox}{\@tempboxa}}
{\end{lrbox}\lst@com@box[\lst@com@width]{\@tempboxa}\endgroup}

\newcommand\lstCom[1][11cm]{%
  \begin{lstComment}[#1]\bgroup\aftergroup\lst@com@endenv%
}
\def\lst@com@endenv{%
  \end{lstComment}%   
  \egroup
}
\newcommand{\lst@com@box}[2][]{%
  \tabto{#1}\usebox{#2}%
}
\makeatother

\lstset{
  language={Java},basicstyle=\ttfamily,columns=fullflexible
}

\begin{document}

\lstset{ morecomment=**[l][{\lstCom[10cm]}]{//} }
\begin{lstlisting}
public class HelloWorld { // We may have  many classes
  public static void main(String[] args) { // but only one main() method!
    System.out.println("Hello, World");
  } // here we terminate
} // end of the world
\end{lstlisting}

\end{document}

在此处输入图片描述

您必须对行\lstCom中给出的参数进行一些调整morecomment=才能获得合适的缩进。如果源行大于缩进,注释将作为额外行插入。但是,如果注释超出可用空间,则注释本身不会跨行拆分。这应该是可能的,但需要一些额外的工作。

答案2

这不是你想要的,但准确地说,你使用环境明确地改变 TeX 内的代码lstlisting

\begin{lstlisting}[language=python]
for index in range(314):
    print "Easy as sweet potato pie."
\end{lstlisting}

这样做有其缺点,因为你不能编辑你的 Java 源代码来纠正实际的错误,而必须返回并重新制作相同的变化到你的 TeX,修复注释。

好的一面是,你可以直接(但有限地)控制输出。注释可能排列不整齐,在这种情况下,可能还有以下两种方法:

  1. listings更改默认使用的字体。
  2. 做一些相对严肃的文本处理。使用\@for一些废话。还有其他东西。(或者可能是 LuaTeX?我还没弄过它……)

也可以看看https://tex.stackexchange.com/a/31352/17423如果您在 TeX 中复制源代码,则是一个很好的解决方案。不幸的是,此解决方案要求您对注释的宽度设置硬性限制。不过,可以定义多个间距。

相关内容