12

ユーザー定義の latex マクロをすべてその定義に置き換えるにはどうすればよいですか?

たとえば、このファイルを指定すると

古いテックス

\newcommand{\blah}[2]{#1 \to #2}
...
foo \blah{egg}{spam} bar
...

以下のファイルを自動的に生成する方法

new.tex

...
foo egg \to spam bar
...

perl で latex マクロ ロジックを再実装する代わりに、latex または tex エンジン自体を使用してこれを行うことはできますか?

4

4 に答える 4

13

出来上がり http://www.ctan.org/tex-archive/support/de-macro

これは次のような Python です。

[...] (re)newcommand または (re)newenvironment コマンド、ドキュメント内、またはドキュメントの「プライベート」パッケージ ファイルで定義されたマクロを展開します。

于 2010-04-27T14:20:38.560 に答える
1

PythonでJinja2などのテンプレートエンジンを使用することを検討してください。

LaTeX自体との互換性を高めるために、構文をデフォルトの{%、{{などから変更することをお勧めします。例えば:

env = jinja2.Environment(
      loader=jinja2.FileSystemLoader( JINJA_DIRS ),
      comment_start_string='["', # don't conflict with e.g. {#1
      comment_end_string = '"]',
      block_start_string = '[%',
      block_end_string = '%]',
      variable_start_string = '[=',
      variable_end_string = ']',
      autoescape=True,
      finalize=_jinja2_finalize_callback, # make a function that escapes TeX
      )

template = env.get_template( self.template )

tex = template.render( content ) 

テンプレートの環境に渡される関数に加えて、Jinja2はマクロをサポートします。たとえば、上記のコードは次のように機能するはずです。

[% macro blah(egg, spam) -%]
foo [=egg] \to [=spam] bar
[%- endmacro %]

[= blah("chicken","pork") ]
% substitutes with "foo chicken \to pork"

あなたの目標が何であるかはわかりません。これには少し作業が必要ですが、Pythonに精通している場合は、克服できない問題ではありません。

それがお役に立てば幸いです。

于 2009-10-07T19:17:50.270 に答える
1

これが行われたのを見たことはありませんが、2 つの中途半端なアイデア:

  1. これらすべてのマクロをインラインで展開する理由がデバッグのためである場合、\tracingmacros=1ドキュメントで設定するとすべてのマクロが展開されますが、出力はログ ファイルに送られます。

  2. CTANアーカイブは、定義内の展開をインライン化するために使用できるパッケージを提供します (ただし、newcommand は除きます) \def の

于 2009-10-04T02:24:49.483 に答える