lstlisting について
LaTeX でソースコードを書ける環境の1つに listings パッケージのlstlisting
があります。\lstset
というコマンドでプレアンブルから色々カスタマイズできて、自分は下のような設定をしています。他のサイトからコピペした部分もあればオリジナルでカスタマイズした部分もあります。
例えばこんなふうに使います。
\documentclass[a4j,12pt,dvipdfmx]{jsarticle}
\lstset{
stringstyle={\ttfamily},
commentstyle={\ttfamily},
basicstyle={\ttfamily},
columns=fixed,
frame={tb},
breaklines=true,
columns=[l]{fullflexible},
numbers=left,%行数を表示したければonにする
numberstyle={\scriptsize}
xrightmargin=0em,
xleftmargin=3em,
stepnumber=1,
numbersep=1em,
tabsize=2,
lineskip=-0.5ex
}
\begin{document}
\begin{lstlisting}
import numpy as np
a=1
b=np.sqrt(0.5)
t=0.25
p=1
for i in range(1,4):
a1=(a+b)/2
b1=np.sqrt(a*b)
t1=t-p*(a-a1)**2
p1=2*p
a=a1
b=b1
t=t1
p=p1
mypi=((a+b)**2)/(4*t)
print(mypi)
\end{lstlisting}
\end{document}
ガウス・ルジャンドルのアルゴリズムによって円周率を求める python コードです。行番号つきです。
出力した pdf を png 画像にしたもの
出力した pdf
https://github.com/migawariw/lstlisting_with_copy/files/9489821/cannotcopy.pdf
行番号をコピーさせない
さてここからが本題です。出力した pdf を開いての中のコードをコピーしてそれをどこかにペーストしてみてください(macの preview や safari を想定していますが他の viewer でも構いません)。おそらく次のように行番号ごと選択されて行番号が残ったままペーストされてしまうでしょう。
ペースト後の様子
import numpy as np
2 a=1
3 b=np.sqrt(0.5)
4 t=0.25
5 p=1
6 for i in range(1,4):
7 a1=(a+b)/2
8 b1=np.sqrt(a*b)
9 t1=t-p*(a-a1)**2
10 p1=2*p
11 a=a1
12 b=b1
13 t=t1
14 p=p1
15 mypi=((a+b)**2)/(4*t)
16 print(mypi)
行番号が文字として表示されてしまっています。これではソースコードの意味を成しません(まあ列選択して消せばいいのですが…)。行番号を表示しつつ、なおかつ行番号を抜いてコピペできる必要があります。
しかしこれを何と検索したら解決するのか自分にはわかりませんでした。長らくこれに悩んで行番号をつけられずにいたのですが、最近ようやく解決しました。\lstset
の中に以下を追加して背景色をつけます。
backgroundcolor=\color{white}
あと色を使っているので color または xcolor パッケージを読み込む必要があります。こうすると下のようにいい感じに選択できるようになります。
ペースト後の様子
import numpy as np
a=1
b=np.sqrt(0.5)
t=0.25
p=1
for i in range(1,4):
a1=(a+b)/2
b1=np.sqrt(a*b)
t1=t-p*(a-a1)**2
p1=2*p
a=a1
b=b1
t=t1
p=p1
mypi=((a+b)**2)/(4*t)
print(mypi)
githubに上げました。copipeimg.pdf が行番号ごと選択しちゃう方、copipeimg2.pdfが行番号なしで選択する方です。
https://github.com/migawariw/lstlisting_with_copy/blob/main/copipeimg.pdf
反省
サンプルコードが縦長すぎた…