类似于问题“Latex 编辑器/IDE“,“我很好奇是否有任何编辑器或插件直接支持 LaTeX 文档源 (.dtx) 格式。
我认为这样的编辑器应该支持实现和文档的语法高亮,也许可以使用不同的背景来增加各部分之间的对比度。正如大多数编辑器会保留换行符的缩进一样,%
在文档模式中保留行距也会很有帮助。支持特定宏的额外好处Doc
。
有这样的事吗?有足够多的人实际编辑.dtx
文件以满足足够的需求吗?
答案1
一些编辑器有专门的.dtx
模式。从个人经验来说,编辑如果你想要一个“重量级”的编辑器,那么它就很不错。作为替代方案,特克斯沃克斯很容易使用新的语法高亮样式进行自定义。我使用 TeXworks 的自定义正则表达式集进行.dtx
编辑:
[LaTeX DTX]
# comments
red Y \^\^A.*
# Guards
orange N %<(?:[A-Za-z0-9!\|]+|.)>
limegreen N %<\*(?:[A-Za-z0-9!\|]+|.)>
crimson N %</(?:[A-Za-z0-9!\|]+|.)>
# special characters
darkred N \^\^\^\^\^[0-9a-z]{5}
darkred N \^\^\^\^[0-9a-z]{4}
darkred N \^\^\^[0-9a-z]{3}
darkred N \^\^[0-9a-z]{2}
darkred N [$#^_{}&]
gray N ^%%.*
gray N ^%
# Macrocode
green N \\(?:begin|end)\{macrocode\}
# LaTeX environments
darkgreen N \\(?:begin|end)\s*\{[^}]*\}
# control sequences
blue N \\(?:[A-Za-z@:_]+|.)
另一个常见的选择,但我没有用过,是曲线下面积,插入Emacs。
(我已经介绍过.dtx
关于我的博客中编辑的一些细节过去:我在那里给出的编辑列表与我在这里给出的相同。
答案2
你可以这样做Vim。它禁用文件的“%”注释.dtx
。您可以为环境内的所有代码重新激活它{macrocode}
,甚至可以切换语言。这通过Vim 技巧 857。
我使用了这个,svn-multi-pl.dtx
它实际上描述了一个 Perl 脚本。
答案3
作为另一种选择,我只是随便为 TextMate 提供了一个解决方案。它并不复杂,但需要一些技巧才能在实现和文档中同时使用现有的 LaTeX 语言语法。
它有几个问题。最值得注意的是,许多.dtx
文件对 的 catcode 做了一些奇怪的事情$
,因此,TextMate 会疯狂地尝试匹配所有$
s,即使没有匹配的对。由于某些.dtx
文件可能超过 30k 行,这可能会导致解析器锁定相当长一段时间(除了解析 之后的所有错误内容$
)。
我latex.tmbundle
直接从GitHub 上的官方分支,但它可以轻松地集成到其他分支中。
以下是纯文本格式的 plist 语言:
{ scopeName = 'text.tex.latex.dtx';
firstLineMatch = '^%\s*\\iffalse\s+(?:meta-)?comment';
fileTypes = ( '.dtx' );
patterns = (
{ name = 'text.tex.latex.dtx.implementation';
begin = '(?:^(%) (\\begin){macrocode}|^(%)\s*(\\iffalse\b)(.*)$\n)';
end = '(?:^(%) (\\end){macrocode}|^(%)\s*(\\fi)\b)';
beginCaptures = {
1 = { name = 'comment.block.tex.latex.dtx'; };
2 = { name = 'keyword.control.tex'; };
3 = { name = 'comment.block.tex.latex.dtx'; };
4 = { name = 'keyword.control.tex'; };
5 = { name = 'comment.block.tex.latex.dtx'; };
};
endCaptures = {
1 = { name = 'comment.block.tex.latex.dtx'; };
2 = { name = 'keyword.control.tex'; };
3 = { name = 'comment.block.tex.latex.dtx'; };
4 = { name = 'keyword.control.tex'; };
};
patterns = (
{ match = '^(%)(<[\*/]?(?:[A-Za-z0-9!\|]+|.)>)';
captures = {
1 = { name = 'comment.block.tex.latex.dtx'; };
2 = { name = 'entity.name.selection.tex.latex.dtx'; };
};
},
{ include = 'text.tex.latex'; },
);
},
{ name = 'comment.block.tex.latex.dtx';
match = '^%';
},
{ name = 'text.tex.latex.dtx.documentation';
begin = '(\\CharacterTable)\b';
end = '(?<!\\)}';
beginCaptures = { 1 = { name = 'keyword.control.tex'; }; };
patterns = (
{ name = 'comment.block.tex.latex.dtx';
match = '^%';
},
{ name = 'markup.raw.charactertable';
match = '.';
},
);
},
{ include = 'text.tex.latex'; },
);
}