2

我目前有一个 tex.snippets 文件来保存片段,这使得在 LaTeX 中编写作业更容易。例如,我有一个形式为“2problem”的片段:

snippet 2problem
    \begin{homeworkProblem}
        \begin{enumerate}
            \item[] $1
                $2
            \item[] $3
                $4
        \end{enumerate}
    \end{homeworkProblem}
endsnippet

这给了我一个开始两部分问题的简单方法。但是,有没有办法制作一个输出 n 部分问题的片段?现在我有单独的片段来处理不同数量的问题,这很乏味。

4

2 回答 2

0

我知道,这不是一个 ultisnip 解决方案,以防万一:mu-template支持片段中的循环和递归。这就是我如何从C 和 C++ 中的枚举定义生成switch-case 构造。定义起来有点麻烦,但效果很好。

于 2015-01-27T10:59:41.137 回答
0

使用片段定义:

post_jump "dynamicsnippet(snip)"
snippet '(\d+)problem' rb
        \begin{homeworkProblem}
                \begin{enumerate}
`!p snip.rv=create_partprob(int(match.group(1)))`
                \end{enumerate}
        \end{homeworkProblem}
endsnippet

将这段代码附加到所需片段文件的末尾。(可能类似于 tex.snippets)

global !p
def dynamicsnippet(snip):
    # Create anonymous snippet body
    anon_snippet_body = ""

    # Get start and end line number of expanded snippet
    start = snip.snippet_start[0]
    end = snip.snippet_end[0]

        # Append current line into anonymous snippet
    for i in range(start, end + 1):
        anon_snippet_body += snip.buffer[i]
        anon_snippet_body += "" if i == end else "\n"

    # Delete expanded snippet line till second to last line
    for i in range(start, end):
        del snip.buffer[start]

    # Empty last expanded snippet line while preserving the line
    snip.buffer[start] = ''

    # Expand anonymous snippet
    snip.expand_anon(anon_snippet_body)
def create_partprob(n):
 out=""
 placeholder=1
 for _ in range(0,n):
   out+=24*" "+"\\item[] $"+f"{placeholder}\\\\\\\\\n"
   placeholder+=1
   out+=24*" "+"   $"+f"{placeholder}\\\\\\\\\n"
   placeholder+=1
 out=out[:-1]
 return out
endglobal

它适用于我的编辑器和 Ultisnips,希望它也适用于你的编辑器。祝你好运!

编辑:使用专门为 vim 和 vi 相关问题制作的堆栈来解决此类问题。您可以在此处找到该站点。

于 2021-01-26T09:53:27.493 回答