使用 orgtbl,如何确保大括号和美元符号不被转义?

使用 orgtbl,如何确保大括号和美元符号不被转义?

小调组织结构是一个可以轻松创建乳胶表的绝佳工具(您应该看看!)。

但是,我在导出时遇到了问题。如果我在单元格中的内容被括号包围,括号会用反斜杠转义。此外,如果此内容包含美元,美元也会被转义。

如果括号中是已知的宏的分隔参数,则不会发生这种情况AUCTeX(请参见下面 MWE 中的第二个单元格),但如果宏未知,则会发生这种情况。

有时,即使没有宏,用括号括起来内容也是需要的,例如,siunitx对于仅看起来像数据的内容,这是必需的。

组织手册提到了选项:no-escape t,但它只能防止&%#_^逃脱(无意冒犯)。但是,我几乎可以肯定这是一种行为上的改变,因为在一年前的相同情况下,这个选项正在解决这个问题。

“几乎”很重要,但是……情况真的一样吗?另外,我当时使用的是不同的电脑,不同的版本emacsorg所以降级不是解决这个问题的选项。

所以,问题是:如果这确实是一种行为改变,那么其理由是什么,是否有已知的解决方法?如果我错了,而且情况一直如此,是否有简单的解决方法?或者我应该尝试理解orgtbl-to-generic并建议一个补丁?

MWE(输入和输出):

\documentclass{article}

\usepackage{verbatim}
\usepackage{amsmath}

\begin{document}

Without no-escape:
% BEGIN RECEIVE ORGTBL Without
\begin{tabular}{ll}
Col 1 & Col 2 \\
\{Braced content\} & $\text{Math content}$ \\
\{\$\text{Braced and math!}\$\} &  \\
\end{tabular}
% END RECEIVE ORGTBL Without
\begin{comment}
#+ORGTBL: SEND Without orgtbl-to-latex :splice nil :skip 0
| Col 1                       | Col 2                 |
| {Braced content}            | $\text{Math content}$ |
| {$\text{Braced and math!}$} |                       |
\end{comment}

\vspace{2cm}

With no-escape:
% BEGIN RECEIVE ORGTBL With
\begin{tabular}{ll}
Col 1 & Col 2 \\
\{Braced content\} & $\text{Math content}$ \\
\{\$\text{Braced and math!}\$\} &  \\
\end{tabular}
% END RECEIVE ORGTBL With
\begin{comment}
#+ORGTBL: SEND With orgtbl-to-latex :splice nil :skip 0 :no-escape t
| Col 1                       | Col 2                 |
| {Braced content}            | $\text{Math content}$ |
| {$\text{Braced and math!}$} |                       |
\end{comment}

Expected output:  
\begin{tabular}{ll}
Col 1 & Col 2 \\
{Braced content} & $\text{Math content}$ \\
{$\text{Braced and math!}$} &  \\
\end{tabular}  

\end{document}

%%% Local Variables: 
%%% mode: latex
%%% eval: (turn-on-orgtbl)
%%% TeX-master: t
%%% End: 

如果有人观察到不同的行为,这是我的环境:

  • GNU Emacs 24.3.1 (x86_64-redhat-linux-gnu)
  • Org-mode version 8.2.6

该问题似乎与任何与乳胶相关的模式无关,因为如果我打开上述示例fundamental-mode然后打开,也会发生这种情况orgtbl

答案1

(2020 年编辑)在过去 6 年的某个时候,:raw导出功能中添加了一个参数,它的作用正如它的名字所示:将其设置为任何值,但会nil关闭组织原本要进行的任何花哨的转换。


以下内容仅供参考。:)

在进一步研究代码后,我想出了这个肮脏的替代方案orgtbl-to-latex

(defun tv/orgtbl-to-latex (table params)
  (cl-flet ((org-export-string-as (string backend &optional b e) string))
    (orgtbl-to-latex table params)))

其效果是绕过org针对此事的所有导出功能,并直接逐字输出单元格内容。实际上,它确实解决了我的问题,但我不能确定它不会在将来引发更多问题。

编辑:根据 orgmode 邮件列表上的讨论,orgtbl-to-latex给出的定义在手册中在某个时候被改变了,但它仍然按我预期的方式工作:

(defun orgtbl-to-latex-verbatim (table params)
   "Convert the Orgtbl mode TABLE to LaTeX."
   (let* ((alignment (mapconcat (lambda (x) (if x "r" "l"))
                                org-table-last-alignment ""))
          (params2
           (list
            :tstart (concat "\\begin{tabular}{" alignment "}")
            :tend "\\end{tabular}"
            :lstart "" :lend " \\\\" :sep " & "
            :efmt "%s\\,(%s)" :hline "\\hline")))
    (orgtbl-to-generic table (org-combine-plists params2 params))))

在的最新版本中org-modeorgtbl-to-generic给出了一个额外的参数来指定导出后端,并且依次将单元格的内容读取为一些org要转换为的代码latex,而不是一些latex代码。

对于那些只希望使用一个导出函数,但希望使用一个参数来切换逐字导出的人来说,以下定义似乎有效。:from-org t如果您希望 org 发挥其导出魔力,请使用。如果没有标志,此重新定义会将当前默认行为(自 8.2.6 起)恢复为几个月前的状态。如果您不想更改默认设置,请更改标志名称及其解释(如果您需要更多详细信息,请在评论中询问我。

(defun orgtbl-to-latex (table params)
  "Convert the orgtbl-mode TABLE to LaTeX.
TABLE is a list, each entry either the symbol `hline' for a horizontal
separator line, or a list of fields for that line.
PARAMS is a property list of parameters that can influence the conversion.
Supports all parameters from `orgtbl-to-generic'.  Most important for
LaTeX are:

:splice    When set to t, return only table body lines, don't wrap
           them into a tabular environment.  Default is nil.

:fmt       A format to be used to wrap the field, should contain %s for the
           original field value.  For example, to wrap everything in dollars,
           use :fmt \"$%s$\".  This may also be a property list with column
           numbers and formats.  For example :fmt (2 \"$%s$\" 4 \"%s%%\")
           The format may also be a function that formats its one argument.

:efmt      Format for transforming numbers with exponentials.  The format
           should have %s twice for inserting mantissa and exponent, for
           example \"%s\\\\times10^{%s}\".  LaTeX default is \"%s\\\\,(%s)\".
           This may also be a property list with column numbers and formats.
           The format may also be a function that formats its two arguments.

:llend     If you find too much space below the last line of a table,
           pass a value of \"\" for :llend to suppress the final \\\\.

The general parameters :skip and :skipcols have already been applied when
this function is called."
  (let* ((alignment (mapconcat (lambda (x) (if x "r" "l"))
                   org-table-last-alignment ""))
     (params2
      (list
       :tstart (concat "\\begin{tabular}{" alignment "}")
       :tend "\\end{tabular}"
       :lstart "" :lend " \\\\" :sep " & "
       :efmt "%s\\,(%s)" :hline "\\hline")))
    (require 'ox-latex)
    (let* ((*orgtbl-transform* (plist-get params :from-org))
           (backend (if *orgtbl-transform* 'latex nil)))
      (orgtbl-to-generic table (org-combine-plists params2 params) backend))))

相关内容