如何将程序和文本并排放置?

如何将程序和文本并排放置?

我的第一个问题是,如何用 LaTeX 编写程序,每行有或没有行号。

第二个问题是,由于我的程序通常不太大,我想在它的右侧留出一些空间用于文本。所以我们可以想象两个并排的矩形部分:一个程序和一些文本。有人能告诉我如何实现吗?

非常感谢!

编辑1:现在我还有另一个需求...我想l1, l2, l3...指定每一行,而不是1, 2, 3...。有人知道怎么做吗?

答案1

我假设您的程序/代码不必在您的文本中浮动,尽管也可以构建一些在您的文档中浮动的内容。

您可以使用multicol包裹生成一个 2 列环境,将程序/代码放在左侧minipage环境.此示例代码

\documentclass{article}
\usepackage[margin=25mm]{geometry}
\usepackage{algpseudocode}
\usepackage{multicol}
\begin{document}

\begin{multicols}{2}% 2-column layout
  \begin{minipage}{0.45\textwidth}
    \begin{algorithmic}[1]% Taken from the algorithmicx package documentation
      \Procedure{Euclid}{$a,b$}
      \State $r\gets a\bmod b$
      \While{$r\not=0$}
        \State $a\gets b$
        \State $b\gets r$
        \State $r\gets a\bmod b$
      \EndWhile\label{euclidendwhile}
      \State \textbf{return} $b$
      \EndProcedure
    \end{algorithmic}
  \end{minipage}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum venenatis facilisis arcu, a malesuada elit vulputate quis. Duis et interdum eros. Maecenas ac sem at elit rutrum vehicula eu et elit. In convallis justo in arcu condimentum a adipiscing tortor auctor. Nam adipiscing ante sed ante vehicula tincidunt. Morbi volutpat purus tortor, a venenatis turpis. Vestibulum tristique augue ut dui cursus a aliquam velit volutpat.
\end{multicols}

\end{document}

生产

左侧为程序代码|右侧为说明

这里必须注意描述长度不要超过程序代码。上面的程序代码是algpseudocode使用algorithmicx包裹. 算法的外观可以通过多种方式改变,正如包装文档例如,下面是不同的行号样式(产生l1l2,...,l9):

\algrenewcommand{\alglinenumber}[1]{\footnotesize\texttt{l}#1:}% l1, l2, ...

Algorithmicx 显示不同的行号样式(<10 行)

如您所见,这对于少于 10 行的伪代码非常有效。为了容纳更多行,您可以使用:

\algrenewcommand{\alglinenumber}[1]{\footnotesize\texttt{l}\ifnum#1<10 \phantom{0}\fi #1:}% l 1, l 2, ... l 9, l10, l11, ...

Algorithmicx 显示不同的行号样式(<99 行)

或者,将两个相应的组件(程序/代码和描述)分别放在一个小页面中,这样您就可以偏离长度限制,就像@xport 的回答。 这listings包裹用于导入和格式化代码。

这些方法都不允许程序/代码和描述组件跨页面流动,因为minipage环境不会跨页面中断。

答案2

假设您的程序是用 Visual Basic 编写的,其调用方式VisualBasicCode.vb如下。

' VisualBasicCode.vb
Sub Signal(strSignalfolge As String, Optional lngTakt As Long = 100)
'Prozedur erzeugt eine Serie von Warntönen.
'Die optionale Variable lngTakt gibt den Takt in Millisekunden vor (Standard: 100 ms)
'Das Muster kann über die String-Variable strSignalfolge beeinflusst werden:
' Stern (*)     -> 1 Warnton
' Ziffern 1..9  -> 1..9 Takte Pause
' Leerzeichen   -> 1 Sekunde Pause
' Minus (-)     -> 1.5 Sekunden Pause
    Dim i As Integer
    Dim b As String
    For i = 1 To Len(strSignalfolge)
        b = Mid(strSignalfolge, i, 1)
        Select Case b
            Case "*": beep
            Case 1 To 9: DELAY CInt(b) * lngTakt
            Case " ": DELAY 1000
            Case "-": DELAY 1500
        End Select
        DELAY lngTakt
    Next i

End Sub

Public Function strParse(Data As String, Trenn As String, Nr As Integer)
'Funktion trennt die Zeichenkette <Data>
    On Error Resume Next
    Dim MainData() As String, SplitData() As String
    MainData = Split(Data, Trenn)
    SplitData = Split(MainData(Nr - 1), Trenn)
    strParse = SplitData(0)
End Function


Public Sub ProtokollZeile(strData As String)
'Gibt eine Protokollzeile im Direktfenster aus: Datum, Uhrzeit und <strData>
    Debug.Print Now & " " & strData
End Sub

Sub NetSend(strmsg As String, Optional strEmpf As String = "imf3beck")
'Prozedur sendet die Kurznachricht <strMsg> über das Intranet an den Rechner <strEmpf>
    Dim a
    a = Shell("cmd.exe /c net send " & strEmpf & " " & strmsg, vbMinimizedFocus)
    MsgBox "(net send message)" & vbCr & strmsg
End Sub

Sub NetSendMessungBeendet(Optional strBem As String = "")
'Sendet über das Netzwerk eine Statusnachricht, dass die Messung beendet wurde und gibt diese
'Nachricht auch lokal als Warndialog aus
Dim strMsgText As String
strMsgText = (Format(Now, "hh:mm:ss") & " Messung beendet" & strBem)
NetSend (strMsgText)
End Sub

Public Function ZellBereichAdresse(strZellber As String) As String
Application.Volatile
ZellBereichAdresse = CStr(Range(strZellber).Address)
End Function

TeX 输入文件:

\documentclass[dvipsnames,cmyk]{article}
\usepackage[a4paper,hmargin=1cm,vmargin=2cm]{geometry}
\usepackage{listings,xcolor,lipsum}

\lstset
{
    breaklines=true,
    tabsize=3,
    showstringspaces=false,
    aboveskip=-\fboxsep% it is needed to remove vertical white space
}


\lstdefinestyle{Common}
{
    extendedchars=\true,
    language={[Visual]Basic},
    frame=single,
    %===========================================================
    framesep=3pt,%expand outward.
    framerule=0.4pt,%expand outward.
    xleftmargin=3.4pt,%make the frame fits in the text area. 
    xrightmargin=3.4pt,%make the frame fits in the text area.
    %=========================================================== 
    rulecolor=\color{Red}
}

\lstdefinestyle{A}
{
    style=Common,
    backgroundcolor=\color{Yellow!10},
    basicstyle=\scriptsize\color{Black}\ttfamily,
    keywordstyle=\color{Orange},
    identifierstyle=\color{Cyan},
    stringstyle=\color{Red},
    commentstyle=\color{Green}
}

\lstdefinestyle{B}
{
    style=Common,
    backgroundcolor=\color{Black},
    basicstyle=\scriptsize\color{White}\ttfamily,
    keywordstyle=\color{Orange},
    identifierstyle=\color{Cyan},
    stringstyle=\color{Red},
    commentstyle=\color{Green}
}

\begin{document}
\begin{minipage}[t]{0.48\linewidth}%
\lstinputlisting[style=A]{VisualBasicCode.vb}
\end{minipage}\hfill
\begin{minipage}[t]{0.48\linewidth}
\lipsum[1-5]
\end{minipage}
\end{document}

输出:

在此处输入图片描述

答案3

要回答您的第一个问题,您可能需要使用algorithm2e.sty,这是一个带有算法关键字的浮动算法环境。您可以在以下链接的 CTAN 上找到它:

http://ctan.org/tex-archive/macros/latex/contrib/algorithm2e/

要对算法进行编号,请使用该\LinesNumbered命令。由于这是一个浮动算法环境,因此可以像对图形进行编号一样在其周围环绕文本。对此我不确定,因为我没有尝试过。但是,这可能会或可能不会回答您的第二个问题。

答案4

另一种可能性是使用以下代码创建一个浮动容器:浮行打包并使用列表格式化代码的包参见示例。应该可以使这个浮点数表现得像一个环绕图形,从而显示在文本旁边。

相关内容