LaTeX 中的代码折叠

LaTeX 中的代码折叠

我使用的编辑器 Texmaker 只为语言中的内容提供代码折叠功能,例如\section\begin{foo} ... \end{foo}。我希望能够创建自己的折叠部分,例如在 Visual C++ 中我可以编写#pragma region foo ... #pragma endregion。具体来说,我想在任何代码中隐藏的第一件事是开头的包含,对于 LaTeX 来说,是命令\usepackage{}。我想制作一个自定义环境:

\newenvironment{folding}{}{}
\begin{folding}
\usepackage{geometry}
\end{folding}

但是,这无法构建。有人能解释一下原因吗?有没有办法定义一个可以正常工作的环境?

答案1

造成这种情况的原因在于 LaTeX 环境的工作方式。

命令\begin{...}启动一个组,存储环境名称,然后执行环境启动命令\end{...}命令检查您是否关闭了正确的环境,执行环境结束命令并关闭一个小组。

组有很多影响,其中之一就是当组关闭时,对组内变量(以及类似命令定义)的非全局赋值会被撤销。因此,您通常不想在组内加载包。(实际上可能会\usepackage检查这一点。)

如果您并不真正想要一个组而只是折叠,我建议您查看编辑器的配置,看看是否可以使用一些不影响 LaTeX 看到的实际代码的注释结构。

否则,您可能能够执行与document环境类似的操作 - 在其启动命令中,它首先关闭\begin再次启动的组,因此没有多余的组。但随后您可能需要管理当前环境变量,这样\end{folding}就不会给你一个错误。看看 source2e 看看内核是如何做到的。

答案2

感谢 Paulo,我找到了解决这一特殊问题的方法。在 Texmaker 中,以下内容将折叠:

%\begin{}
\usepackage{foo}
%\end{}

这也适用于:

  • Visual Studio Code(带james-yu.latex-workshop扩展)

答案3

由于几乎所有的 LaTeX 编辑器至少都支持折叠 \begin 和 \end,因此这里有一个“真正的”空环境:

\makeatletter
\newenvironment{folding}{\endgroup}{\begingroup \def \@currenvir{folding}\edef \@currenvline{\on@line}}
\makeatother

\begin{folding}只会结束内部组,而\end{folding}只是重新创建\begin

测试:

\begin{folding}
\newcommand{\mycommand}{Hello World}
\end{folding}
\mycommand

将打印Hello World

答案4

如果您将光标直接放在第一行代码之前,也就是 texmaker 中 # 所在的位置 (#\documentclass[@]{@}),则可以折叠整个前言。每个 \usepackage{@} 都将被折叠。

相关内容