在LaTeX模式的Emacs中缩进一段C代码

7
我的问题是我在emacs中编写一个包含大量C代码的LaTeX文档。我在各个地方使用\minted和\verbatim环境。当我编译LaTeX(使用pdflatex)时,生成的pdf看起来很好。在原始的LaTeX代码中,我希望能够按照C-major模式的规则自动缩进。
例如,我想标记以下区域:
\begin{verbatim} 

void main(void)
{
printf("Hello World \n\r");
}

\end{verbatim}

并让Emacs自动格式化它以看起来像
\begin{verbatim}

void main(void)
{
    printf("Hello World \n\r");
}

\end{verbatim}   

换句话说,我希望能够在LaTeX模式下使用C模式的规则运行实际为C代码的部分上的indent-region命令。 有人知道是否可能吗?

u-punkt和Simon都提供了可行的答案。有没有什么办法可以加快这个过程呢?例如,在我的.emacs中编写一个小函数,可以启动c-mode、缩进并切换回LaTeX模式? - jarvisschultz
我认为我的答案会满足你的需求。 - Tyler
如果你不知道的话,你看过LaTeX Listings包了吗?我相信你可以直接输入源代码,无需复制和粘贴。 - TreyA
我曾经使用过listings包和minted(我更喜欢后者),但它们并不能满足我的需求。它们只能在LaTeX编译期间格式化代码,而我需要的是格式化一个原始文本“.tex”文件。 - jarvisschultz
明白了,我的建议是将verbatim块从.tex文件中移出,并将源代码放入.c文件中。然后,在emacs中查看/编辑.c文件时,它会进行正确的c格式化。在.tex文件中,您可以通过\lstinputlisting{source_filename.c}包含源代码,其中现在包含您的verbatim块。 - TreyA
3个回答

4

M-x indent-region 仅对选中区域进行缩进,而不是整个缓冲区,因此:

  1. 开启 C 模式
  2. 缩进您的选定区域
  3. 重新开启 LaTeX 模式

4
你可以使用C-x 4 c将当前缓冲区克隆到一个间接缓冲区中。将该间接缓冲区放入c-mode并在其中进行缩进。关于间接缓冲区的更多信息,请参见Emacs信息手册,节点'Indirect Buffers'

3

这里有一个快速解决办法。经过一些工作,您可以使其通用 - 即,检查当前的 major-mode,并在完成后切换回该模式。按照现有方式,它切换到 c-mode,缩进,然后切换到 LaTeX-mode(AucTeX),这样可以解决即时问题:

(defun indent-region-as-c (beg end)
  "Switch to c-mode, indent the region, then switch back to LaTeX mode."
  (interactive "r")
  (save-restriction
    (narrow-to-region beg end)
    (c-mode)
    (indent-region (point-min) (point-max)))
    (LaTeX-mode))

将其绑定到您喜欢的按键上,然后您就可以开始了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接