我论文中的列表是 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}
- 有没有办法可以手动编辑 TeX 内部的代码?
- 如何在代码中的特定点获取分页符?例如,如果我想在图片中看到页面底部的 for 循环,我该怎么做?
- 请提供所有与 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,修复注释。
好的一面是,你可以直接(但有限地)控制输出。注释可能排列不整齐,在这种情况下,可能还有以下两种方法:
listings
更改默认使用的字体。- 做一些相对严肃的文本处理。使用
\@for
一些废话。还有其他东西。(或者可能是 LuaTeX?我还没弄过它……)
也可以看看https://tex.stackexchange.com/a/31352/17423如果您在 TeX 中复制源代码,则是一个很好的解决方案。不幸的是,此解决方案要求您对注释的宽度设置硬性限制。不过,可以定义多个间距。