FortranからPythonを呼ぶ(その2):Intelコンパイラとforpyを組み合わせる
試した環境
mac OS 12.6
ifort (IFORT) 2021.7.0 20220726
Python 3.9.12 :: Intel Corporation
gfortranを使っているQiitaの記事を参考に試してみたところ、いくつか対策が必要になった。
※Qiitaの記事
qiita.com
具体的には、次の3点。
- forpyのモジュールをリンクする際に、呼ぶPythonのライブラリのパスとして-L/opt/intel/oneapi/intelpython/latest/libを追加しないと、libpython3.9.dynalibがリンクできないために最終的な実行形式ファイルができない
- 実行ファイルを走らせると、リンクできるはずの上記のライブラリが見つからないと言い出すので、/usr/local/libにlibpython3.9.dynalibのシンボリックリンクを追加
- 環境変数PYTHONHOMEを設定しないと、python本体を見つけられないらしいので、PYTHONHOMEとして/opt/intel/oneapi/intelpython/latestを設定
2番めのシンボリックリンクを作るところは、付け焼き刃過ぎて後に禍根を残しそう。
人には薦めがたいやり方なので、もっといいやり方を探したい。
python-docxを使う(その3)フォントの指定
文書全体で変えたいとき
意識に上ることはあまりないが、MS Wordは、LaTeXのクラスファイルと同じようなファイルで文書のフォーマットを管理しており、スタイルと呼ばれるらしい。多分、スタイルに関する情報も文書ファイル中に埋め込まれているのだと思う。
何も指定しないと英語名称のNormalというスタイルが使われる。日本語名称は「標準」だったと思う。
文書全体で変えたいときは使っているスタイルをカスタマイズする。例えば、游明朝を本文のフォントに使いたい場合
from docx import Documentfrom docx.oxml.ns import qn
という準備の後に
document = Document()style = document.styles['Normal']style.font.name = 'Times New Roman'style.element.rPr.rFonts.set(qn('w:eastAsia'), '游明朝')
という具合にする。新規のオブジェクトを作った後に、style.font.nameで何らかの英文フォントを先に指定して、その後、日本語のフォントを指定しないといけない点がポイント。
ただ、こうすると、上の例では半角文字ではTimes New Romanを使う。半角文字も游明朝にしたい場合、最後の行の後で
style.font.name = '游明朝'
と、style.font.nameを再定義すると、使えるようになる。
参考にしたのは
http://www.jhanmath.com/?p=130
というサイト。中国語のサイトだが、言いたいことは大体伝わる。同じ苦労をしているのだろうと想像される。
文書の一部で変えたいとき
以下のようにしたら動いた。
準備として
from docx.oxml.ns import qn
と、qnなるものをimportしておき
paragraph = document.add_paragraph()
pw = paragraph.add_run('あいうえお')
pw.font.name = '游ゴシック Medium'
pw._element.rPr.rFonts.set(qn('w:eastAsia'), pw.font.name)
という具合にすると、add_runで追加した文字のフォントを変えられた。
python-docxを使う(その2)紙のサイズとマージンの指定
MS Wordのデフォルトの紙のサイズはいわゆるレターサイズなので、これをA4サイズに変更する方法。
ついでにマージンの指定の仕方も。
from docx.shared import Mm
document = Document()
section = document.sections[0]
section.page_height = Mm(297)
section.page_width = Mm(210)
section.left_margin = Mm(25.4)
section.right_margin = Mm(25.4)
section.top_margin = Mm(25.4)
section.bottom_margin = Mm(25.4)
section.header_distance = Mm(12.7)
section.footer_distance = Mm(12.7)