如何创建特定代码列表宏

如何创建特定代码列表宏

我正在尝试在乳胶中重现一个宏,以便可以插入以下格式的代码: 在此处输入图片描述 因此,有一个带有清单编号的标题,从文档左侧开始。它位于两行之间。接下来是源代码,并且仅在代码清单开始之后。到目前为止,我有类似以下内容:

\newcommand{\insertCode}[4]{%
Źródło: Na podstawie \cite{#4}
\lstinputlisting[language=#2,caption={#3},label=#1]{#1}
}

我像这样运行它:

\insertCode{kody/testjava.jar}
           {Java}
           {Test java listing}
           {oprWlasne}

问题是我的标题不是从左侧开始,而是从中间开始,并且源位于列表标题上方,而不是在标题和代码之间: 在此处输入图片描述

我的列表配置如下:

% kolory
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.5,0.5,0.5}
\definecolor{mymauve}{rgb}{0.58,0,0.82} 

\lstset{ %
  backgroundcolor=\color{white},   % choose the background color
  basicstyle=\footnotesize,        % size of fonts used for the code
  breaklines=true,                 % automatic line breaking only at whitespace
  captionpos=t,                    % sets the caption-position to top
  commentstyle=\color{mygreen},    % comment style
  escapeinside={\%*}{*)},          % if you want to add LaTeX within your code
  keywordstyle=\color{blue},       % keyword style
  stringstyle=\color{mymauve},     % string literal style
  numbers=left,                    % line numbers on
}

有没有办法在标题和代码本身之间插入引用?如何让标题从页面左侧开始而不是中间开始,并将“列表”的名称更改为自定义名称?我将不胜感激所有帮助。

编辑:在这里我添加MWE:

% Klasa:
\documentclass[12pt]{mwart}

% Kodowanie:
\usepackage[utf8]{inputenc}

% kody
\usepackage{lipsum}
\usepackage{listings}

% kolory
\usepackage{color}
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.5,0.5,0.5}
\definecolor{mymauve}{rgb}{0.58,0,0.82} 

\lstset{ %
  backgroundcolor=\color{white},            % choose the background color
  basicstyle=\ttfamily\footnotesize,        % size of fonts used for the code
  breaklines=true,                          % automatic line breaking only at whitespace
  captionpos=t,                             % sets the caption-position to top
  commentstyle=\color{mygreen},             % comment style
  escapeinside={\%*}{*)},                   % if you want to add LaTeX within your code
  keywordstyle=\color{blue},                % keyword style
  stringstyle=\color{mymauve},              % string literal style
  numbers=left,                             % line numbers on
  frame=/lines,                             % frame box config
}

% Numerowanie obiektow wedlug rozdzialow
\usepackage{chngcntr}
\AtBeginDocument{\counterwithin{lstlisting}{section}}
\counterwithin{figure}{section}
\counterwithin{table}{section}

\newcommand{\insertCode}[4]{%
\lstinputlisting[language=#2,caption={#3},label=#1]{#1}
Źródło: Na podstawie \cite{#4} \\
}

% START:
\begin{document}

\insertCode{test.java}
           {Java}
           {test java code}
           {somerefference}


\end{document}

我不知道如何使用示例代码,因此我test.java也添加了代码文件:

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!"); // Display the string.
        for (int i = 0; i < 100; ++i) {
            System.out.println(i);
        }
    }
}

答案1

我认为您必须自己绘制标题。下面的代码尝试执行此操作,但请注意,这不支持浮动列表。

\documentclass[10pt]{mwart}

\usepackage{booktabs}
\usepackage{listings}

\usepackage{color}
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.5,0.5,0.5}
\definecolor{mymauve}{rgb}{0.58,0,0.82}

\lstset{
  backgroundcolor=\color{white},            % choose the background color
  basicstyle=\ttfamily\footnotesize,        % size of fonts used for the code
  breaklines=true,                          % automatic line breaking only at whitespace
  commentstyle=\color{mygreen},             % comment style
  escapeinside={\%*}{*)},                   % if you want to add LaTeX within your code
  keywordstyle=\color{blue},                % keyword style
  stringstyle=\color{mymauve},              % string literal style
  numbers=left,                             % line numbers on
  aboveskip=0pt,                            % no skip above
  belowskip=\smallskipamount,               % small skip below
  lineskip=1ex,                             % extra space between lines
}

\renewcommand*\lstlistingname{Kod \'zr\`od\l owy}
\renewcommand*\lstlistlistingname{Kody \'zr\'od\l owe}

\usepackage{chngcntr}
\AtBeginDocument{\counterwithin{lstlisting}{section}}
\counterwithin{figure}{section}
\counterwithin{table}{section}

\newcommand{\insertCode}[4]{%
    \par
    \begingroup
    \normalfont
    \normalsize
    \parindent=0pt
    \parskip=0pt
    \vskip\abovetopsep
    \hrule height\heavyrulewidth
    \vskip\belowrulesep
    \addtocounter{lstlisting}{1}%
    \textbf{\lstlistingname~\thelstlisting} \strut#3\strut\par
    \addtocounter{lstlisting}{-1}%
    \vskip\aboverulesep
    \hrule height\lightrulewidth
    \vskip\belowrulesep
    \strut \'Zr\'od\l o: Na podstawie~\cite{#4}\par
    \medskip
    \lstinputlisting[language=#2,caption={[#3]},label=#1]{#1}%
    \vskip\aboverulesep
    \hrule height\heavyrulewidth
    \vskip\belowrulesep
    \endgroup
}

% START:
\begin{document}

\lstlistoflistings

\section{First section}
\section{Section section}
\insertCode{test.java}
           {Java}
           {test java code}
           {somerefference}


\end{document}

在此处输入图片描述

需要注意一些事项。

  • 尽管\insertcode宏本身会排版标题,但它也会将其作为短标题名称传递给\lstinputlisting。这会导致它在 中显示适当的标题房源列表
  • 在水平规则方面,我与您显示的图像略有不同。我使用了booktabs包中的一些宏/尺寸来生成我认为看起来更好的规则。特别是,顶部和底部规则略粗。三个\hrules 及其相应的\vskips上下对应booktabs' \toprule\midrule\bottomrule。如果您不喜欢它们的外观,可以轻松更改。当然,如果您将其用于booktabs表格(您应该这样做),这将提供漂亮的统一外观。
  • 计数器产生的数字遵循您设置的格式,即\counterwithin{lstlisting}{section}。由于计数器\lstinputlisting本身会增加lstlisting,因此此代码会在排版标题之前手动增加计数器,然后立即减少计数器。
  • 您的示例图像没有颜色或任何特殊格式,但您的 MWE 包含设置这些的代码。我保留了您的代码。
  • 每行之间似乎有一些额外的空格。我猜测了一下这个值应该是什么(例如 1)。其他值(包括没有)可能更适合lineskip

相关内容