小调组织结构是一个可以轻松创建乳胶表的绝佳工具(您应该看看!)。
但是,我在导出时遇到了问题。如果我在单元格中的内容被括号包围,括号会用反斜杠转义。此外,如果此内容包含美元,美元也会被转义。
如果括号中是已知的宏的分隔参数,则不会发生这种情况AUCTeX
(请参见下面 MWE 中的第二个单元格),但如果宏未知,则会发生这种情况。
有时,即使没有宏,用括号括起来内容也是需要的,例如,siunitx
对于仅看起来像数据的内容,这是必需的。
这组织手册提到了选项:no-escape t
,但它只能防止&%#_^
逃脱(无意冒犯)。但是,我几乎可以肯定这是一种行为上的改变,因为在一年前的相同情况下,这个选项正在解决这个问题。
“几乎”很重要,但是……情况真的一样吗?另外,我当时使用的是不同的电脑,不同的版本emacs
,org
所以降级不是解决这个问题的选项。
所以,问题是:如果这确实是一种行为改变,那么其理由是什么,是否有已知的解决方法?如果我错了,而且情况一直如此,是否有简单的解决方法?或者我应该尝试理解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-mode
,orgtbl-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))))