根据两列中的位置设置不同的环境设置

根据两列中的位置设置不同的环境设置

我有一个 lstlisting 环境,它显示文档左侧或右侧的行号。

通过传递参数设置 lstlisting 环境

在双列文档中设置 ruby​​ 代码时,我根据文档的最终布局不断更改数字参数。以下屏幕截图显示了最终布局中错误的数字位置。

在此处输入图片描述

\end{lstlisting}
\begin{lstlisting}[language=ruby, numbers=left,firstnumber=1]
...
\end{lstlisting}

有没有办法根据 lstlisting 环境位于文档的哪一侧来设置 lstlisting 环境?

添加

我使用 IEEEtran 类,它有自己的选项。可以从中找到它http://tug.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/IEEEtran.cls

\documentclass[conference]{IEEEtran}
\usepackage{cite}

...

\DeclareOption{oneside}{\@twosidefalse\@mparswitchfalse
                        \CLASSOPTIONonesidetrue\CLASSOPTIONtwosidefalse}
\DeclareOption{twoside}{\@twosidetrue\@mparswitchtrue
                        \CLASSOPTIONtwosidetrue\CLASSOPTIONonesidefalse}

\DeclareOption{onecolumn}{\CLASSOPTIONonecolumntrue\CLASSOPTIONtwocolumnfalse}
\DeclareOption{twocolumn}{\CLASSOPTIONtwocolumntrue\CLASSOPTIONonecolumnfalse}

添加 2

该代码运行良好。

\documentclass[conference]{IEEEtran}
\usepackage{listings}
\usepackage{lipsum}

\lstdefinelanguage{rruby}{
        escapechar=\,
        basicstyle=\scriptsize\ttfamily,
        numberstyle=\scriptsize\ttfamily,
        stepnumber=1,
        numbersep=3pt,
        showstringspaces=false,
        breaklines=true,
        frame=lines,
        %backgroundcolor=\color{background},
        literate=
         *{0}{{{\color{numb}0}}}{1}
            {1}{{{\color{numb}1}}}{1}
            {2}{{{\color{numb}2}}}{1}
            {3}{{{\color{numb}3}}}{1}
            {4}{{{\color{numb}4}}}{1}
            {5}{{{\color{numb}5}}}{1}
            {6}{{{\color{numb}6}}}{1}
            {7}{{{\color{numb}7}}}{1}
            {8}{{{\color{numb}8}}}{1}
            {9}{{{\color{numb}9}}}{1}
            {:}{{{\color{punct}{:}}}}{1}
            {,}{{{\color{punct}{,}}}}{1}
            {\{}{{{\color{delim}{\{}}}}{1}
            {\}}{{{\color{delim}{\}}}}}{1}
            {[}{{{\color{delim}{[}}}}{1}
            {]}{{{\color{delim}{]}}}}{1},
            }

\lstset{
    basicstyle=\ttfamily\scriptsize,
}
\makeatletter
\lstnewenvironment{ruby}{
        \if@firstcolumn       
            \lstset{emph={def, class, end, typedef, type, constraint, sentence},emphstyle=\textbf, language=rruby, numbers=left}
        \else
            \lstset{emph={def, class, end, typedef, type, constraint, sentence},emphstyle=\textbf, language=rruby, numbers=right}
        \fi
}{}
\makeatother


\begin{document}
\lipsum

\begin{ruby}
...
\end{ruby}
\begin{lstlisting}[language=ruby, numbers=left,firstnumber=1]
...
\end{lstlisting}
\end{document}

添加 3

当 listings 环境处于浮动环境时,代码不起作用。

根据两列中的位置设置不同的环境设置(也考虑图形环境)

答案1

该命令\if@firstcolumn可以检测您所在的列;然后,您可以使用\lstnewenvironment它来创建一个环境,在每个列表之前设置编号。(可能还有其他解决方案,例如每列顶部的钩子,但我不确定。)

\makeatletter
\lstnewenvironment{tclist}{
    \if@firstcolumn
      \lstset{numbers=left}
    \else
      \lstset{numbers=right}
    \fi
}{}
\makeatother

然后,您就可以使用\begin{tclist}...\end{tclist}就像在文档中使用\begin{lstlisting}...一样。\end{lstlisting}

以下是一个示例文档:

\documentclass[twocolumn]{IEEEtran}
\usepackage{listings}
\lstset{
    basicstyle=\ttfamily\scriptsize,
}
\makeatletter
\lstnewenvironment{tclist}{
% ...same definition as above goes here...
\makeatother
\usepackage{lipsum}
\begin{document}
\lipsum[1-2]
\begin{tclist}
#!/bin/bash

echo hello, world.
\end{tclist}
\lipsum[3-5]
\begin{tclist}
#!/bin/env python3

def main():
    print("Hello, world.")

if __name__ == '__main__':
    main()
\end{tclist}
\end{document}

输出如下: 在此处输入图片描述

相关内容