ラテックスのPython

LaTeXでPythonを使用すると非常に便利です。 Pythonが適切なコードを書くとがらくたになる可能性があるため、提案されたメソッドは安全ではないと見なされることをすぐに警告します。



スタイルファイルの形式で既製のメソッドがあり、次のように使用されます。

  \ usepackage {python}
 \ begin {python}
数学インポート罪から
 a = sin(5)
 c =罪(9)
 b =最大(a、c)
プリントb
 \ end {python} 




実際、このパッケージはjobname.pyを作成し、出力をjobname.py.out、jobname.py.errに書き込み、読み取ります。

この方法は、変数がコードからコードに保存されないため、ピクルを使用する必要があり、すべてを再度インポートする必要があるなどの点で悪く、すべての計算を別のファイルの1か所に置くのが便利なようですだから私はlunaparkを構築しました...



すべてが非常に簡単です。 次をプリアンブルに追加します。

  \ newcommand {\ python} [1] {%
 \ immediate \ write18 {python#1> ./py.out 2> ./py.err}
 \即時\入力 "py.out"}

 \ newcommand {\ ptn} [1] {%
 \ python {./ path_to_your_scripts / script_name.py#1}}

 \ newcommand {\ peval} [1] {%
 \ python {-c "p​​rint#1" | ./path_to_your_scripts/sedder}}

 \ newcommand {\ comments} [1] {} 




最初のマクロは指定した引数でpythonを呼び出し、2番目は引数付きで特定のスクリプトを実行し、3番目は単一行のPythonコードを実行できます。その後、小さなsedで事前に変換され、ドットがコンマに置き換えられます。 最後のマクロは、問題がPython出力とLatexのエラーのどこにあるかが明確になると付け加えました



スクリプトでは、素敵な結論を出すためのちょっとしたコツがあります(数学的な環境の場合のみですが)。グレーも共有できます(当然、sedは、ある場合にのみ機能します)。



セダー:



  #!/ bin / sh
 sed -e 's /\./,/'
 #実行可能にします。 




ファイルの終わり "./path_to_your_scripts/script_name.py":



 インポートシステム
再インポートサブから
 __future__インポート部門から

 def toStr(num、digitsAfter = 2):
     "" "Num to string with zero stripping" ""
     frmt = '%。'  + str(digitsAfter)+ 'f'
     num =(frmt%num)
     num = num.strip( '0')
     num [0] == '。'の場合:
         num = '0' + num
     num [-1] == '。'の場合:
         num = num.strip( '。')
     numを返す

 def tenpower(数値、最大値= 1e3、最小値= 1e-2、ベース= 1):
     "" "numを(num1、num2)に変換します。num1* 10 ** num2 = num
最小<num <最大でない場合に変換します。
 base <num1 <2 * base "" "まで変換します
     pwr = 0

    一方、abs(num)> maximumまたは(abs(num)> 2 * base and pwr> 0):
         pwr + = 1
         num = num / 10
    一方、abs(num)<最小または(abs(num)<base and pwr <0):
         pwr-= 1
         num = num * 10
     num、pwrを返します

 def latexize(num、power = False、delim = '、'):
    電源の場合:
         return( '%s \\ cdot 10 ^ {%d}'%(num、power))。replace( '。'、delim)
    その他:
         return str(num).replace( '。'、delim)

 __name__ == "__main__"の場合:
 #try:
     argc = len(sys.argv)
     var = 'Ooopsy-doopsy!'
     digitsAfter = 2
     typ = 10
     argc> 1:の場合
         var = sub( '[{} \。]'、 ''、sys.argv [1])
         comment = '\\コメント{%s}'%sys.argv [1]
         var = globals()[var]
    その他:
         ValueErrorを発生させます
     argc> 2:の場合
        試してください:
             digitsAfter = int(sys.argv [2])
        を除く:
             typ = sys.argv [2]
     argc> 3:の場合
         typ = sys.argv [2]
         digitsAfter = int(sys.argv [3])

     mini = 1/10 ** digitsAfter

     typ in( 'int'、 'i')の場合:
        印刷コメント、int(var)
     ['float'、 'f'、 'nomath']のエリフtyp:
        コメントを出力+ latex(toStr(var、digitsAfter))
    その他:
        文字列= tenpower(var、minimum = mini)
        コメントを出力+ latexize(toStr(strings [0]、digitsAfter)、string [1])

 #except例外:
 #合格 




つまり、LaTeXで「\ ptn {varAn1}」と入力すると、変数「varAn1」の値は、「./ path_to_your_scripts / script_name.py」で定義されている場合、最終ドキュメントに置き換えられます。 そして、「\ peval {1./5}」と書くと、0.2になります。 私はこの\ pevalを使用しなかったので、それを終了せず、お粗末に動作します



PSあなたはオプション "-shell-escape"でそのようなLaTeXファイルを処理する必要があります



All Articles