0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TeXで複数言語のプログラミングコードを不具合なく記述する

Last updated at Posted at 2025-07-06

はじめに

TeXで複数のプログラミング言語のコードを記述するとき、そのまま記述するとLstlistingLstinlineの各言語の書式設定が混ざってしまう不具合があります。
そこでどのようにすれば複数のプログラミング言語のそれぞれの設定で記述できるかを説明します。

そのまま記述すると?

まず、そのまま記述してみるとどのようなことが起きるか見てみます。

例としてHaskellとPythonのコードを記述する場合を考えます。
分かりやすさのために、Haskellコードの文字を黒、背景を白に、Pythonコードは反転して文字を白、背景を黒に設定します。

\usepackage{listings}
\usepackage{color}

\lstset{
	language = Haskell,
	basicstyle = {\color{black}},
	backgroundcolor = {\color{white}}
}

\lstset{
	language = Python,
	basicstyle = {\color{white}},
	backgroundcolor = {\color{black}}
}

そこで、以下のように両方のコードを記述してみます。

\begin{lstlisting}[language = Haskell, caption = Haskell]
main :: IO ()
main = putStrLn "Hello world"
\end{lstlisting}

\begin{lstlisting}[language = Python, caption = Python]
print("Hello World")
\end{lstlisting}

ここで設定通りPythonだけ文字色が反転して欲しいのですが、結果は以下のように両方反転したものになります。

LstTest_page-0001-3.jpg

これはおそらく、オプションlanguageを指定しても最後に設定したlsesetの内容が反映されてしまうこと、すなわち変数が上書きされてしまうのが原因だと思われます。

そこで、各言語設定をそれぞれ適用して、Pythonだけ反転するようにするには以下のようにします。

言語設定

最後に設定したlstsetの内容が反映されるなら、コードを記載する直前にlstsetを設定してしまうという方法を取ります。

そこで、各lstsetを呼び出すマクロをそれぞれ定義します。

\newcommand\lstsetHaskell{
    \lstset{
    	language = Haskell,
    	basicstyle = {\color{black}},
    	backgroundcolor = {\color{white}}
    }
}

\newcommand\lstsetPython{
    \lstset{
    	language = Python,
    	basicstyle = {\color{white}},
    	backgroundcolor = {\color{black}}
    }
}

上に設定したlstsetを呼び出すコマンドをそれぞれ\lstsetHaskell\lstsetPythonという名前で定義します。

そして、それを各言語のコードを記述する直前に挿入するだけです。

このとき、lstlistinglanguageオプションを入れる必要はないです。

\lstsetHaskell
\begin{lstlisting}[caption = Haskell]
main :: IO ()
main = putStrLn "Hello world"
\end{lstlisting}

\lstsetPython
\begin{lstlisting}[caption = Python]
print("Hello World")
\end{lstlisting}

すると以下のように各言語設定が反映されます。

LstTest_page-0001-2.jpg

しかしながら毎回\lstsetHaskell\lstlsetPythonと入れるのは面倒なので、次のようなマクロを組みます。

使いやすいようにマクロを組む

個人的に以下のようなマクロを作っています。

lstlisting

\begin{lstlisting}\end{lstlisting}の代わりに\begin{haskellCode}\end{haskelCode}で囲んで記述できるようにします。

ユーザ定義環境は通常\newenvironmentを使って定義しますが、この中に\begin{lstlisting}\end{lstlisting}を入れると定義自体はできますがコードの記述が通りません。
そこで、代わりに専用コマンド\lstnewenvironmentを使います。

コメントで指摘していただいた@mod_poppo様、ありがとうございます。

\lstnewenvironment{haskellCode}[#1][]{\lstsetHaskell\lstset{#1}}{}
\lstnewenvironment{pythonCode}[#1][]{\lstsetPython\lstset{#1}}{}

ここで任意の引数を1つ取っていて、それによってlstsetを上書きして変更したりcaption等をつけることが可能です。

\begin{haskellCode}[caption = Haskell]
main :: IO ()
main = putStrLn "Hello world"
\end{haskellCode}

\begin{pythonCode}[caption = Python]
print("Hello World")
\end{pythonCode}

lstinline

\lstinlineでも同様にマクロを定義できます。

\newcommand\inHaskell{\lstsetHaskell\lstinline}
\newcommand\inPython{\lstsetPython\lstlinline}

\lstinlineの時にこれの代わりにそれぞれ\inHaskell\inPythonと記述することでそれぞれの設定で記述できるようにしています。

"Hello World"を出力するには, Haskellでは\inHaskell{putSrtLn "Hello World"}, Pythonでは\inPython{print("Hello World")}と記述します.

まとめ

TeXで複数のプログラミング言語のコードを記述する際に、それぞれの設定を反映させながら記述する方法を記載しました。

0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?