如何在 LaTeX 中排版 VBA 代码?

如何在 LaTeX 中排版 VBA 代码?

我有很多 VBA(Visual Basic for Applications,Microsoft Office 中的编程语言)代码,我必须将其添加到附录中的论文中。

我想知道如何才能最舒服地列出那些代码行(必须以某种方式构造,因为有很多行)并将它们包括在我的 pdflatex 文档中。

这里有人有排版大量 VBA 代码的经验吗?


Option Explicit

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

答案1

listings包将会帮助你。

使用style=A

在此处输入图片描述

使用style=B

在此处输入图片描述

TeX 输入文件

\documentclass[dvipsnames,cmyk]{article}
\usepackage{listings,xcolor}

\lstset
{
    breaklines=true,
    tabsize=3,
    showstringspaces=false
}


\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{lstlisting}[style=A]%please try style=B
Option Explicit

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
\end{lstlisting}
\end{document}

笔记:

  1. 最好使用 从 TeX 输入文件中导入 VBA 源代码\lstinputlisting[<options>]{filename.vb}。这样可以使您的 TeX 输入文件干净。
  2. style=A通过更改为 来尝试我的风格style=BB。

答案2

您的选择包括:

我会选择 minted。注意它使用色素因此其依赖项包括 python + pygments。您还必须使用选项调用 TeX 引擎-shell-escape。例如

xelatex -shell-escape source_file.tex

编辑

首先我是一名 Python 爱好者!:P

现在更认真地说,我更喜欢 minted,因为我发现它更容易设置。您不必花时间处理listings' 选项以获得彩色输出。通常每种语言的默认值都可以。如果您想排版一种晦涩难懂的语言,您也有很大灵活性。Pygmentize 几乎为所有内容提供了词法分析器。

我必须承认我还没有将它用于大量的代码片段,所以我不知道编译时间是否变得难以接受。

我认为最好的选择是尝试两者并选择更适合您的一个!

这是 MWE

\documentclass[12pt, final]{article}

\usepackage{minted}

\begin{document}

\begin{minted}{python}
class FancyColoredStuff(object):
    def __init__(self, language):
        self.language = language

    def highlight(self):
        print "This is colorful code in %s" % self.language
\end{minted}

\end{document}

相关内容