我使用的编辑器 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{@} 都将被折叠。