我的第一个问题是,如何用 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
包裹. 算法的外观可以通过多种方式改变,正如包装文档例如,下面是不同的行号样式(产生l1
,l2
,...,l9
):
\algrenewcommand{\alglinenumber}[1]{\footnotesize\texttt{l}#1:}% l1, l2, ...
如您所见,这对于少于 10 行的伪代码非常有效。为了容纳更多行,您可以使用:
\algrenewcommand{\alglinenumber}[1]{\footnotesize\texttt{l}\ifnum#1<10 \phantom{0}\fi #1:}% l 1, l 2, ... l 9, l10, l11, ...
或者,将两个相应的组件(程序/代码和描述)分别放在一个小页面中,这样您就可以偏离长度限制,就像@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
命令。由于这是一个浮动算法环境,因此可以像对图形进行编号一样在其周围环绕文本。对此我不确定,因为我没有尝试过。但是,这可能会或可能不会回答您的第二个问题。