我想从 LaTeX 标记中提取内容,修改内容,然后将其复制到剪贴板。具体来说,我想将所有内容拉入
\textsc{}
环境中并将其更改为大写。这需要类似 \textsc{3sg.hum}
的东西并输出 3SG.HUM
。到目前为止我编写的函数将删除标记,但不会将其内容大写,因此当我在 \textsc{3sg.hum}
上运行函数时,它会输出 3sg.hum
。
这是我到目前为止编写的代码。截至目前,我只是将输出写入消息缓冲区,稍后我将处理剪贴板的内容。
(defun reformat-latex-gloss (beginning end)
"Strip LaTeX environments, converting small caps to uppercase"
(interactive "r")
(if (use-region-p)
(let* ((gloss (buffer-substring beginning end))
(replacement
(replace-regexp-in-string
"\\\\textsc{\\(.*?\\)}"
(upcase "\\1")
gloss
nil)))
(message "%s" replacement))
""
)
)
当我在
\textsc{3sg.h}
之类的东西上运行此函数时,它输出 3sg.h
而不是预期的 3SG.H
。线路好像有问题(upcase "\\1")
;如果我将 \\1
替换为像 test
这样的字符串,输出将为大写 TEST
,所以看起来 upcase
并不像我预期的那样应用于编号匹配。
我没有运气找到这个问题的解决方案。像 this 这样的许多资源都展示了如何在交互模式下执行此类操作,但我想以非交互方式运行它。我对 Elisp 还很陌生,所以我可能会忽略一些简单的事情。感谢您的帮助!
我想出了一个解决办法。我需要将替换内容包装在 lambda 表达式中并调用
match-string
,因此功能代码是
(defun reformat-latex-gloss (beginning end)
"Strip LaTeX environments, converting small caps to uppercase"
(interactive "r")
(if (use-region-p)
(let* ((gloss (buffer-substring beginning end))
(replacement
(replace-regexp-in-string
"\\\\textsc{\\(.*?\\)}"
(lambda (match)
(upcase (match-string 1 match)))
gloss)))
(message "%s" replacement))
""
)
)