9

ですから、私はしばらくの間、研究ノートを取るためにorg-modeを使用しています。ラテックス(私の論文の場合)とhtml(私のブログの場合)の両方にシームレスにエクスポートする方法が大好きです。ただし、#+LATEX_HEADERを指定して\newcommandでマクロを定義すると、これらはHTMLエクスポートにまったく表示されません。

私は現在、これらすべてのコマンドを(\ newcommand \ newcommandなど)として先頭に配置し、texファイルから「(」と「)」を手動で削除することでこれを処理しています。

私にできることは、これらのコマンド用のドロワーを保持し、このドロワーを適切に処理するためにorgモードのhtmlおよびlatexエクスポートをカスタマイズすることでした。

たとえば、orgファイルに次を追加します。

:LATEX_MACROS:
\newcommand{\norm}[1]{\lVert{#1}\rVert}
\newcommand{\abs}[1]{\lvert{#1}\rvert}
\newcommand{\half}{\frac{1}{2}}
:END:

そしてエクスポート後、これはヘッダーセクションのラテックスファイルとhtmlファイルに次のように表示されます

\(
\newcommand{\norm}[1]{\lVert{#1}\rVert}
\newcommand{\abs}[1]{\lvert{#1}\rvert}
\newcommand{\half}{\frac{1}{2}}
\)
4

4 に答える 4

6

これは、この記事の執筆時点でOrg、pdflatex、MathJaxで機能するスタンドアロンの方法です。ドロワー(または少なくともLATEXMACROSドロワー)がエクスポートされていることを確認し(これがデフォルトです)、Orgファイルの上部近くに挿入します。

#+OPTIONS: toc:nil
#+DRAWERS: LATEXMACROS ...

:LATEXMACROS:
@@html:<div style="display: none">@@
\(
\global\def\mymacro{...}
\global\def\mymacrow2args#1#2{...}
...
\)
@@html:</div>@@
:END:

#+TOC: headlines

これは、次の問題を回避します。

  • 数学環境(ここ\( ... \))を使用する必要があります。そうしないと、OrgはTeX構文をエスケープします。

  • \newcommandLaTeXはそれらがプリアンブルにあることを期待し、MathJaXはそれを受け取らないため、を使用することはできません。\newcommandプリアンブルの外で使用できますが、LaTeXは(MathJaxとは異なり)定義されたマクロを現在の数学環境に制限します。通常、ファイル内のどこでも使用したいと思います。

  • プレーンはスコープ(MathJaxの場合はグローバル、LaTeXの場合はローカル)の\defように動作するため、プレーンを使用することはできません。MathJaxが認識していないため、どちら\newcommandも使用できません。\xdef

  • MathJaxは知りませんが、とにかくグローバルな\globalものを使用することを妨げることはありません。ただし、 Webページの\defそれぞれに赤い警告が表示されます。\globalそれらを取り除くために、表示されていないHTMLセクション内に数学環境を配置します。

  • MathJaxの場合、マクロはデフォルトの場所にある目次に間に合うように定義されません。見出しでマクロを使用して目次が必要な場合は、でデフォルトを無効に#+OPTIONS: toc:nilし、ドロワーの後に手動で追加し#+TOC: headlinesます。

警告:

  • 小さなTeXファイルのOrgビルドには環境が含まれていないため、カスタムマクロを使用するラテックスフラグメントをプレビューすることはできません。

  • とは異なり\newcommand\def何でも静かに置き換えます。また、その構文は少し異なります。

  • 数学環境はpdflatexの出力で垂直方向のスペースを占めるため、それが問題にならない場所(たとえば、最初の見出しの前)に配置する必要があります。

  • これはおそらく実際にはバージョンに依存します:

    • 組織モードは、LaTeXマクロのエクスポートでより良くなる可能性があります(たとえば、解析時にスマートになり#+LATEX_HEADER、新しいエクスポートオプションを提供し、エスケープせず\newcommandに正しく処理されたプリアンブルに入れることで、MathJaxに送信します)。

    • MathJaxは\xdef、のエイリアスとして受け入れ\defたり、無視したりする\global場合があります(HTMLセクションのトリックが不要になるため)。

于 2014-02-12T19:51:18.303 に答える
3

私はそれを自分で行う方法を考え出しました。これは、ラテックスファイルの先頭(つまり、\ begin {document}の外側)にラテックスパーツを配置しないため、おそらく最も洗練されたソリューションではないことに注意してください。ただし、私にとっては十分に機能します。

(setq org-export-blocks
  (cons '(latexmacro org-export-blocks-latexmacro) org-export-blocks))

(defun org-export-blocks-latexmacro (body &rest headers)
  (message "exporting latex macros")
  (cond
   ((eq org-export-current-backend 'html) (concat "\\(" body "\\)"))
   ((eq org-export-current-backend 'latex) body)
   (t nil))
)
于 2012-10-04T01:26:40.947 に答える
3

Orgの動的ブロックを使用した代替ソリューション(スタンドアロンではない)。

  • 私の元のソリューションの警告はありません(OrgがLaTeXまたはHTMLに実際に期待するものを生成するため)
  • LaTeXモードでマクロを編集することが可能です(C-c C-'

折り返し電話

次の内容で名前を付けたファイルを作成し、org-dblock-write:block-macro.elEmacsのロードパスに追加します。

(defun org-dblock-write:block-macro (params)
  (let ((block-name (or (plist-get params :from) "macros"))
    (org-buf (current-buffer)))
    (with-temp-buffer
      (let ((tmp-buf (current-buffer)))
    (set-buffer org-buf)
    (save-excursion
      (org-babel-goto-named-src-block block-name)
      (org-babel-mark-block)
      (let ((mblock-begin (region-beginning))
            (mblock-end (region-end)))
        (set-buffer tmp-buf)
        (insert-buffer-substring org-buf mblock-begin mblock-end)))
    (set-buffer org-buf)
    (insert "#+BEGIN_HTML\n\\(\n")
    (insert-buffer-substring tmp-buf)
    (insert "\\)\n#+END_HTML\n")
    (set-buffer tmp-buf)
    (beginning-of-buffer)
    (while (re-search-forward "^" nil t)
      (replace-match "#+LATEX_HEADER: " nil nil))
    (set-buffer org-buf)
    (insert-buffer-substring tmp-buf)))))

組織ファイル

ファイルのどこかに、以下を作成します。

  • マクロを含む「macros」という名前のLaTeXソースブロック
  • 空のblock-macro動的ブロック

ソースブロックの名前を変更したり:from <custom-name>、動的ブロックでヘッダー引数を使用したりできます。また、ソースブロック内に注意してください:exports none(通常、LaTeXソースをエクスポートする必要はありません)。

#+NAME: macros
#+BEGIN_SRC latex :exports none
  \newcommand\a{a}
  \def\b{b}
  \DeclareMathOperator\c{c}
#+END_SRC
#+BEGIN: block-macro
#+END:

ここC-c C-cで、動的ブロック上のポイントで使用すると、次のように更新されます。

#+BEGIN: block-macro
#+BEGIN_HTML
\(
      \newcommand\a{a}
      \def\b{b}
      \DeclareMathOperator\c{c}
\)
#+END_HTML
#+LATEX_HEADER:       \newcommand\a{a}
#+LATEX_HEADER:       \def\b{b}
#+LATEX_HEADER:       \DeclareMathOperator\c{c}
#+LATEX_HEADER: 
#+END:

マクロが変更されるたびにこれを実行します。

于 2014-06-27T17:37:24.267 に答える
1

私は通常、多くのドキュメントで再利用する多くのカスタム定義を含むファイルを持っており、それを組織ドキュメントでも使用したいと考えています。

以下はBlout's回答の修正ですので、詳細については彼の回答をお読みください。

マクロを定義する

(defun org-dblock-write:insert-latex-macros (params)
  (let ((text)
    (file (plist-get params :file)))
    (with-temp-buffer
      (insert-file file)
      (setq text (split-string (buffer-string) "\n" t)))
    (insert (mapconcat (lambda (str) (concat "#+LATEX_HEADER: " str)) text "\n"))
    (insert "\n#+BEGIN_HTML\n\\(\n")
    (insert (mapconcat 'identity text "\n"))
    (insert "\n\\)\n#+END_HTML")))

使用法

ファイルmacros.tex

\newcommand\a{a}
\def\b{b}
\DeclareMathOperator\c{c}

組織ファイル内:

#+BEGIN: insert-latex-macros :file "macros.tex"
#+BEGIN_HTML
\(
      \newcommand\a{a}
      \def\b{b}
      \DeclareMathOperator\c{c}
\)
#+END_HTML
#+LATEX_HEADER:       \newcommand\a{a}
#+LATEX_HEADER:       \def\b{b}
#+LATEX_HEADER:       \DeclareMathOperator\c{c}
#+LATEX_HEADER: 
#+END:
于 2017-02-28T23:36:52.287 に答える