latex - 将日期命令插入代码段崇高文本3

标签 latex sublimetext3 sublimetext-snippet

我正在尝试创建一个片段,以启动一个LaTex文档,其中包含了软件包和所有内容,但我也希望它自动填写日期。我有insertdate软件包,但是我不明白如何使用它。我有代码段代码:

<snippet>
    <content><![CDATA[
\documentclass{article}
\usepackage{amsmath}

\title{${1:title}}
\author{...}
\date{[Todays date here automatically]}

\begin{document}
\maketitle

$0

\end{document}
]]></content>
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
    <tabTrigger>document</tabTrigger> -->
    <!-- Optional: Set a scope to limit where the snippet will trigger -->
    <scope>text.tex.latex</scope> -->
</snippet>

最佳答案

无法直接以传统方式扩展代码段(在这种情况下,即document标签)并使代码段中的一个或多个字段动态更新;为此,您将需要额外的胶水插件代码。

InsertDate软件包提供了多种将日期插入文档的方法,但是没有提供额外的胶水。下面概述了一种方法的示例。

以下所有示例均在名为Packages/User/NewLatexDocument.sublime-snippet的文件中假定以下片段内容;在以下示例中,将该路径替换为代码段的适当路径和文件名。

<snippet>
    <content><![CDATA[
\documentclass{article}
\usepackage{amsmath}

\title{${2:title}}
\author{...}
\date{${1:date}}

\begin{document}
\maketitle

$0

\end{document}
]]></content>
    <description>Create new LaTeX Document</description>
    <tabTrigger>document</tabTrigger>
    <scope>text.tex.latex</scope>
</snippet>

这是您在问题中提供的版本的版本,但是请注意,您问题中的版本已损坏,因为<tabTrigger><scope>行以-->注释序列终止,这是无效的。

此处特别令人感兴趣的是,代码段字段已重新排序,因此date字段是第一个字段,而title是第二个字段,出于稍后我们将要看到的原因。

知道User包在哪里也很重要;如果不确定,可以从菜单中选择Preferences > Browse Packages...来找到位置。在MacOS上,菜单位置改为Sublime Text > Preferences > Browse Packages...

方法1:通过选项卡触发器扩展代码段(无需额外的插件)

可以使用tab触发器(此处为document)来调用代码段,但是如上所述,没有直接方法可以获取InsertDate包来为您插入日期。

可以执行的操作是使用默认键绑定(bind)之一触发手动日期插入。例如,按F5键,它将显示一组日期选项,然后插入一个。从那里,您可以按Tab继续在摘录中。

有关可在此处使用的所有各种键的信息,请参阅该包的文档,或者了解如何制作自己的自定义绑定(bind)以直接以您选择的格式插入。

这不直接是您要执行的操作,而是需要最少工作量的方法。

方法2:通过宏扩展代码段

通过使用Sublime宏,您可以执行单个操作(按键,命令面板输入等),并使这两个操作自动发生。展开代码段并插入日期。

为此,您需要将以下内容保存到sublime-macro包中的User中。只要记住您使用的名称,该名称就没有关系,因为稍后会需要它。在下面的示例中,文件名是Packages/User/NewLatexDocument.sublime-macro
[
    { "command": "insert_snippet", "args": {"name": "Packages/User/NewLatexDocument.sublime-snippet"} },
    { "command": "insert_date", "args": {"format": "%x"} },
    { "command": "next_field" },
]

确保insert_snippet参数中的文件名与代码段的名称匹配。您可能还希望将日期格式更改为您喜欢的任何格式。

当您调用宏时,它会插入代码段,然后触发insert_date函数以插入日期(这就是date字段位于第一位的原因),然后跳至下一个字段,此时您可以开始手动填写其余的片段。

您可以通过从菜单中选择Tools > Macros > User > NewLatexDocument来查看此操作。最后一项将是sublime-macro文件的名称。

现在,您可以创建一个可以为您触发macro的键绑定(bind),因此您不必从菜单中选择它。如上所述,请记住确保sublime-macro的文件名是您创建的文件。

{
    "keys": ["ctrl+alt+shift+d"],
    "command": "run_macro_file",
    "args": {
        "file": "res://Packages/User/NewLatexDocument.sublime-macro"
    }
},

另外,您可以在sublime-commands包中创建一个User文件(例如MyCustomCommands.sublime-commands),其中包含以下内容,这将使命令在命令面板中可用:

[
    {
        "caption": "Create new Latex Document",
        "command": "run_macro_file",
        "args": {
            "file": "res://Packages/User/NewLatexDocument.sublime-macro"
        }
    },
]

方法3:通过选项卡触发器(带有附加插件)扩展代码段

该示例最接近您想要执行的操作,但是还需要做更多的工作。另外请注意,这要求您输入完整的扩展文本(例如document),并且如果碰巧是最好的补充,则不会触发部分匹配。

首先,请确保您已从方法2创建了宏,因为该方法使用相同的宏,但以不同的方式触发它。

接下来,从菜单中选择Tools > Developer > New Plugin...并将默认插件的文本替换为以下代码,然后将其另存为.py文件;在我的示例中,我将文件命名为new_latex_document.py:

import sublime
import sublime_plugin


class NewLatexDocumentCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        # Get the last word of the line the cursor is on
        point = self.view.sel()[0].b
        line = self.view.substr(self.view.line(point))
        word = line.split()[-1]

        # Remove the trigger word
        self.view.replace(edit, sublime.Region(point, point - len(word)), "")

        # Run the macro
        self.view.run_command("run_macro_file", {
            "file": "res://Packages/User/NewLatexDocument.sublime-macro"
        })

这将创建一个名为new_latex_document的命令(基于类的名称命名,而不是保存插件的文件的名称),当您调用它时,它将删除光标所在行的最后一个单词,然后运行上面方法2中的宏。

现在,您需要在自定义键上添加以下键绑定(bind):

{
    "keys": ["tab"],
    "command": "new_latex_document",
    "context": [
        { "key": "selector", "operator": "equal", "operand": "text.tex.latex"},
        { "key": "preceding_text", "operator": "regex_match", "operand": "^.*document$", "match_all": true },
        { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true },
        { "key": "num_selections", "operator": "equal", "operand": 1},            
        { "key": "selection_empty", "operator": "equal", "operand": "true", "match_all": true },

    ]
},

简而言之,这就是说Tab键应该运行我们的新命令,但是只能在text.tex.latex类型的文件中运行,其中光标位置之前的文本是document这个词,其后没有文本,并且其中只有一个光标空选择的文档。

现在,当您输入单词document和Tab并满足这些条件时,将运行定制命令,删除触发单词document,然后展开宏以插入代码段和日期。

请注意,在这种情况下,tabTrigger文件中的scopesublime-snippet被忽略,这就是键绑定(bind)需要显式设置它们的原因。

如果需要,可以增强此插件;例如,除了运行run_macro_file命令外,它还可以直接从宏中执行每个命令,从而节省了一步。

如果您想对日期进行许多此类扩展,则最好使用更具定制性的插件。例如,使用on_query_completions处理程序将允许触发而无需键绑定(bind)。

但是,这是一个更高级的主题。

关于latex - 将日期命令插入代码段崇高文本3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49792527/

相关文章:

java - Sublime Text 3 获取和设置片段 Java

javascript - 触发 SublimeText 自定义片段时如何省略(或删除)自动匹配括号?

r - rmarkdown 是否允许代码块的标题和引用?

editor - 如何对我的 Sublime 语言文件启用拼写检查?

python - 在 sublime 3 api 中将文本插入 View

sublimetext - Sublime text - 参数首字母大写的片段

r - 在 knitrout 环境之后确保相同的垂直空间

emacs - Beamer 组织模式 : pause between blocks, 覆盖,发现 block

latex - 如何重新启动\footnote 编号每页

python-3.x - 导入错误 : No module named 'urllib2' when installing Package Manager in Sublime Text 3