英文:
How to execute a Golang template when "{" or "}" are in the static part of the template?
问题
我的问题是,我想建立一个信件生成器,首先根据用户输入构建一个latex文件,然后通过latex编译成PDF。
模板中包含多行类似于这样的内容:
\setkomavar{signature}{{{.Name}}}
其中latex
部分是\setkomavar{signature}{}
,而go语言的template
部分是{{.Name}}
。
当我尝试加载模板时,它抛出以下错误:
panic: template: letter.tmpl:72: unexpected "}" in command
有没有什么技巧可以帮助解析器处理这种情况?
提前感谢,
Tino
英文:
My Problem is that, I want to build a letter generator, which first builds a latex-file from user input, and then compiles this via latex to PDF.
The template contains multiple lines like this:
\setkomavar{signature}{{{.Name}}}
The latex
part is \setkomavar{signature}{}
, and the template
part from go is {{.Name}}
.
When I try to load the template, it throws this error:
panic: template: letter.tmpl:72: unexpected "}" in command
Is there a trick to help the parser handling such a situation?
Thanks in advance,
Tino
答案1
得分: 16
使用Template.Delims来将定界符设置为一些不冲突的文本。{{
和}}
只是默认值,这种方法允许选择其他定界符。
另一种方法:在模板中,当你想要使用latex的{
和}
时,可以插入一些安全的文本,比如#(
和)#
,然后对模板的输出进行“全局”替换。然而,设置定界符在我看来要容易得多,而且很可能更高效,如果这很重要的话。
英文:
Use Template.Delims to set the delimiters to some non conflicting text. {{
and }}
are just the default values, this method allows to select other delimiters.
Alternative method: In you template, where you want latex's {
and }
, you can insert some safe text instead, like say #(
and )#
and then make a "global" replacement on the output from the template. Yet setting delimiters is far easier IMO and quite probably more performant, if that matters.
答案2
得分: 2
一个更好的解决方案实际上是只使用内置的空白符操作符,例如:
\setkomavar{signature}{ {{- .Name -}} }
开始和结束的-
将删除该标记与下一个非模板标记之间的空白。
希望这有所帮助,更多详细信息请参阅文档。
英文:
A better solution is actually to just use the built in whitespace operators, like:
\setkomavar{signature}{ {{- .Name -}} }
The -
at the beginning and end will remove whitespace between that token and the next non-template token.
Hope that helps, see the docs for more detail
答案3
得分: 0
我之前是通过创建模板函数来实现这个功能的:
<!-- begin snippet: js hide: false -->
<!-- language: lang-golang -->
func texArg(s interface{}) string {
return fmt.Sprintf("{%v}", s)
}
<!-- end snippet -->
我使用template.Funcs将其注册为arg
。然后在我的模板中使用:
<!-- begin snippet: js hide: false -->
<!-- language: lang-golang -->
\textbf{{.Name | arg}}
<!-- end snippet -->
我认为@zzzz的答案更好,因为当你需要嵌套时,这种方法会出现问题,但我还是想把这个留在这里作为另一种方法。
英文:
I was previously doing this by creating the template function:
<!-- begin snippet: js hide: false -->
<!-- language: lang-golang -->
func texArg(s interface{}) string {
return fmt.Sprintf("{%v}", s)
}
<!-- end snippet -->
which I registered as arg
using template.Funcs. Then in my template I had:
<!-- begin snippet: js hide: false -->
<!-- language: lang-golang -->
\textbf{{.Name | arg}}
<!-- end snippet -->
I think @zzzz's answer above is better as this falls apart when you need to nest it, but I thought I'd leave this here for an alternative approach.
答案4
得分: 0
我的临时解决方案是:
\barcode{{print "{" .Barcode}}}
英文:
my adhok solution was:
\barcode{{print "{" .Barcode}}}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论