Nasy
2022 年10 月 16 日 03:18
21
自动根据当前项目设置 latex-header ,不知道会有什么问题。
对于 latex 来说还有很多呢。还是 beamer,xcolor 与 hyperref 需要作为 documentclass 的一部分传进去,\documentclass[xcolor={xxx},hyperref={xxx},…]{beamer},org mode 里面有 latex class options 所以没问题,然而 latex 不是 org,class 倒是 beamer 了,但是 header 部分就不是了,依然继承 org-mode 的 package header。
1 个赞
我使用xenops总是会遇到些怪问题,比如图中,在图片上按enter,效果并不是图片变回公式,而是变成了
\begin{equation*}
\mathcal H(\boldsymbol{p},\boldsymbol{q},t) = \sum^n_{i=1} p_i\dot q^i - \mathcal L(\boldsymbol{q},\boldsymbol{\dot q},t)
(注意到后面的\end{equation*}
没有了,取而代之的是公式预览仍然在,并且与公式无关,所有的公式都这样)
并且只有从公式下方离开公式环境,才会让公式变成预览的样子;如果从上方离开,公式就不会生成预览。
强迫症实在是难受得不行
wang1zhen:
比如图中,在图片上按enter,效果并不是图片变回公式,而是变成了
\begin{equation*}
\mathcal H(\boldsymbol{p},\boldsymbol{q},t) = \sum^n_{i=1} p_i\dot q^i - \mathcal L(\boldsymbol{q},\boldsymbol{\dot q},t)
(注意到后面的\end{equation*}
没有了,取而代之的是公式预览仍然在,并且与公式无关,所有的公式都这样)
这是设计如此,因为 xenops 一开始是作者自用的。
见 xenops-math-render-below-maybe
的 docstring:
Render ELEMENT below ELEMENT, so that the rendering can be monitored while editing.
我不清楚你是讨厌仍然出现图片还是讨厌图片出现的位置,不过这两者都有办法解决,给 xenops-math-render-below-maybe
或 xenops-math-display-image
加个 advice 就好了。
我不清楚这是 bug 还是作者的考量,可能需要去问一下作者。不过源码里是这样的
(defun xenops-math-add-cursor-sensor-property ()
(-when-let* ((element (xenops-math-parse-element-at-point)))
(let ((beg (1+ (plist-get element :begin)))
(end (plist-get element :end))
(props '(cursor-sensor-functions (xenops-math-handle-element-transgression))))
(add-text-properties beg end props)
(add-text-properties (1- end) end '(rear-nonsticky (cursor-sensor-functions))))))
当然你可以修改 beg 的位置。
最后的效果是这样的:
1 个赞
好像我们这里的效果还是不一样,我不修改任何配置的情况下,下方显示预览我认为是预期的行为,但是我的\end{equation*}
不见了,因此比如我想更换environment的时候,把equation*
换成equation
就没法编辑了。而您这里则是把公式预览出现在了\end{equation}
后。我认为最常用的场景,应该是在编辑公式时,将预览显示在\end{equation}
的下方更好一些?
wang1zhen:
我的\end{equation*}
不见了,
这是因为作者用图片 overlay 了这行。我个人也是比较偏好这种形式,因为这行基本上不需要手动去改
用 multiple cursor 之类的一起改 env 可能是更好的办法。
这当然可以,只是个人偏好,不过作者预览用的是 overlay ,你必须要额外处理 \end{equation}
的下方的文本和修改删除 overlay 的函数,所以比较麻烦。
感谢感谢,好像稍微明白一些了。请问如果我希望reveal的时候,就显示原本的公式latex代码,不要预览,就像一个异步的org-fragtog一样工作,该怎么做?
xenops-reveal-at-point
是xenops-define-apply-at-point-command
这个macro定义的,这里面又调用了xenops-apply-operations-at-point
,再往下的嵌套实在是看不懂了。
(defun xenops-math-render-below-maybe (element)
nil)
应该这样就可以了,没有其他测试,不确定是否有副作用
效果:
wang1zhen:
像一个异步的org-fragtog一样工作
你可能还需要 (setq xenops-reveal-on-entry t)
1 个赞
加了xenops之后,我日常使用emacsclient总是加载不出来,但是直接从命令行启动emacs却没问题。
一顿排查之后,定位到一行(add-hook 'org-mode-hook #'xenops-mode)
,去掉这一行一切正常,自己进了org-mode之后也可以正常手动开启xenops-mode。百思不得其解。
后来发现,我设置了initial-major-mode
为org-mode
,去掉这个设置之后,就可以挂hook自动启用xenops-mode了。
另外,有两个踩的坑也做一个记录:
(setq xenops-reveal-on-entry t)
之后的行为其实也和org-fragtog不太一致,我在试的时候发现无论怎么在预览上面上下移动,都不会进入公式编辑环境,一度以为是不是我用了iscroll-mode,previous-line
next-line
被iscroll版本替代了的原因。后来发现,所谓的“entry”,得是左右移动进入才能算。
我自己上面提到的
借鉴了
我自己做了个advice的版本
(defun xenops-math-reveal-alt (element)
(xenops-element-overlays-delete element)
(if current-prefix-arg
(delete-file (xenops-math-get-cache-file element)))
(let ((element-type (plist-get element :type))
(begin-content (plist-get element :begin-content)))
(goto-char (if (eq element-type 'block-math)
(1+ begin-content)
begin-content))))
(advice-add #'xenops-math-reveal :override #'xenops-math-reveal-alt)
不过仍然有个从上方离开公式环境时预览显示不正确的问题,不过无伤大雅。
我倒是不太喜欢 org-fragtog 的方式,已经写好的公式大多数情况下不需要再修改了,这时候频繁地切换反而会影响编辑体验。
Ilya.w
2022 年10 月 17 日 23:14
31
如何对齐 org-latex-preview 预览图的水平基准线?
按照当前思路用最简单的方式优化了基线校准, 最终效果如下:
与原本的效果对比:
旧:
新:
由于实现方式很简单, 只是单纯检查内容是否有上下标. 然后根据这些来单个调整图片位置.
所以目前还有许多不完善的地方, 希望能够慢慢修正.
代码如下:
(defun my/org-latex--get-tex-string ()
"Return the content of the LaTeX fragment at point."
(let ((datum (org-element-context)))
(org-element-property :value datum)))
(defun my/latex-fragment-superscript-p ()
"Return `t' if '^' in current LaTeX fragment."
(memq 94 (string-to-list (my/org-latex--get-tex-string))))
(defun my/latex-fragment-subscript-p ()
"Return `t' if '_' in current LaTeX fragment."
(memq 95 (string-to-list (my/org-latex--get-tex-string))))
(defun my/latex-fragment-script-p ()
"Return `t' if both '_' & '^' in current LaTeX fragment."
(and (memq 94 (string-to-list (my/org-latex--get-tex-string)))
(memq 95 (string-to-list (my/org-latex--get-tex-string)))))
(defun org--make-preview-overlay (beg end image &optional imagetype)
"Build an overlay between BEG and END using IMAGE file.
Argument IMAGETYPE is the extension of the displayed image,
as a string. It defaults to \"png\"."
(setq my/position 'center)
(cond ((my/latex-fragment-script-p)
(setq my/position 'center))
((my/latex-fragment-superscript-p)
(setq my/position 100))
((my/latex-fragment-subscript-p)
(setq my/position 70)))
(let ((ov (make-overlay beg end))
(imagetype (or (intern imagetype) 'png)))
(overlay-put ov 'org-overlay-type 'org-latex-overlay)
(overlay-put ov 'evaporate t)
(overlay-put ov
'modification-hooks
(list (lambda (o _flag _beg _end &optional _l)
(delete-overlay o))))
(overlay-put ov
'display
(list 'image :type imagetype :file image :ascent my/position))))
当然除此之外, 精准的基线校准方案依然是有的, 比如
(texfrag 我很难读懂它的代码, 没有明白它的实现方式.)
同时 dvisvgm
文档中所描述的解决方案: dvisvgm: Generating scalable vector graphics from DVI and EPS files , p363. 与 preview-latex 并调整 preview.el
的变量而可能实现的一种较为完美的解决方案. 但本人目前还没有找到具体实现方式.
直接固定 :ascent 可能不是一种好方法,因为这不仅和是否存在上下标有关,而且和上下标内公式的复杂程度有关,一个稍微极端的例子:
正常应该是这样的:
所以可能还是得参考 preview.el 。
这里我做了一些小的修改. 可以避免行内公式 $...$
出现在文本开头也被识别成行间公式然后居中的情况.
因为我习惯用 \[...\]
来写行间公式了, 所以实现起来就是简单判断一下文本开头是否有 $
.
当然如果习惯使用 $$...$$
来写行间公式可以多写一层判断来实现.
(defun eli/org-justify-fragment-overlay (beg end image imagetype)
(let* ((position (plist-get org-format-latex-options :justify))
(img (create-image image 'svg t))
(ov (car (overlays-at (/ (+ beg end) 2) t)))
(width (car (image-display-size (overlay-get ov 'display))))
(display-p (/= (char-after beg) 36)) ; 判断当前行首字符是否为 "$"
offset) ;;...
;;...
(cond
((and (eq 'center position)
(= beg (line-beginning-position))
display-p)) ;;...
(cond
((and (eq 'right position)
(= beg (line-beginning-position))
display-p)) ;;...
xeonxu
2023 年3 月 14 日 15:46
34
xenops-mode如何在org-mode中生效?org文件中始终无法渲染。tex文件中是可以的。
请问你是指开发预览版本的 Org Mode 9.7 吗? 在这个版本中, 我们重新设计了独立的编辑、渲染模块, 而 xenops
应该大量尝试调用了老版本的函数, 因此不起效果. 你可以尝试开启 org-latex-preview-auto-mode
来达到类似 xenops
的体验.
你这个公式编号命令, 要是 align 环境里写矩阵恐怕是要编错号的. 另外公式图片居中的最简单方法是在 org-format-latex-header
里把公式编号设置在左边, 比如 \documentclass[a5paper, leqno]{article}
. 如果你觉得居中后左边空白太多, 可以用比 a5paper 更小的纸