我正在尝试寻找一个 LaTeX 命令,允许我在给定文本周围重复指定字符(如引号)一定次数。例如,我想定义一个命令\quote[n]{y},如 ,它将输出文本 周围字符(在本例中为引号)的n 次y重复。

是否有一个带有命令的软件包可以完成这项工作?如果没有,我该如何定义它?

请注意,在 LaTeX 中,重复n 次引号意味着左侧的左引号(即 )重复n`次,右侧的右引号(即 )重复n 次'。或者,也可以重复n 次命令\enquote{},并进行适当的调整(每次重复应仅包含一对简单引号)。

OP 编辑​​:有没有办法,而不是将 ` 放在左边,以指示 csquotes 包提供的命令 \enquote* 的左引号(分别表示 ‘)?我这样说是因为我也希望它能适应其他语言,比如德语。

3

  • 1
    看一下包裹pgffor


    – 

  • Expl3 还具有多个用于定义功能的循环。


    – 

  • @elmo 在你已经收到对问题的先前版本的答复后,更改问题通常会被反对。


    – 



最佳答案
3

由于 egreg 发布了 expl3 版本,这里有一个 tex 原始循环,仅用于比较

\documentclass{article}

\begingroup\lccode`~`m\lowercase{\endgroup
\def\Quoted#1#2{%
  $\mathcode`m="8000\def~{\hbox{`}}\romannumeral#1000$%
  #2%
  $\mathcode`m="8000\def~{\hbox{'}}\romannumeral#1000$%
}
}
\begin{document}

\Quoted{1}{abc}

\Quoted{2}{abc}

\Quoted{10}{abc}

\end{document}

9

  • 谢谢,@David Carlisle。有没有办法,不把 ` 放在左边,而是指示 csquotes 包提供的命令 \enquote* 的左引号(分别表示 ‘)?


    – 

  • 这让我想起了


    – 


  • @elmo 是/否我通过使用数学模式给出了一个魔法定义来避免特定的循环mmm(即 roamn for 4000 但这限制了你可以做的事情,你可以生成 mmm 然后循环遍历 m 但然后你也可以从 1 循环到 4 而不用罗马数字技巧这就是@egreg 展示的


    – 

  • @elmo 是的,只需将此答案中的更改\hbox{`}\UseName{csq@thequote@oopen},您就会得到csquotes需要的内容。


    – 

  • @Skillmon 哦,我以为 OP 需要生成,\enquote{\enquote{...{abc}}...}}这样会更难,但是好的,如果您只需要分别使用左引号和右引号,那么正如您所说。


    – 

有了expl3\prg_replicate:nn

我们需要插入零字距以避免连字。

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\Quoted}{O{1}m}
 {
  % #1 = number of quote marks (default 1), #2 = text to be quoted
  \prg_replicate:nn {#1} {`\kern0pt}
  #2
  \prg_replicate:nn {#1} {\kern0pt'}
 }

\ExplSyntaxOff

\begin{document}

\Quoted{abc}

\Quoted[2]{abc}

\Quoted[10]{abc}

\end{document}

为了csquotes

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french,english]{babel}
\usepackage[autostyle,french=guillemets]{csquotes}

\ExplSyntaxOn

\NewDocumentCommand{\Quoted}{O{1}m}
 {
  % #1 = number of quote marks (default 1), #2 = text to be quoted
  \group_begin: \setquotestyle{\languagename}
  \prg_replicate:nn {#1} {\use:c{csq@thequote@oopen}}
  #2
  \prg_replicate:nn {#1} {\use:c{csq@thequote@oclose}}
  \group_end:
 }

\ExplSyntaxOff

\begin{document}

\Quoted{abc}

\Quoted[2]{abc}

\Quoted[10]{abc}

\selectlanguage{french}

{\enquote*{abc}}

\Quoted{abc}

\Quoted[2]{abc}

\Quoted[10]{abc}

\end{document}

3

  • 谢谢,@egreg。有没有办法,而不是在左边放置 `,来指示 csquotes 包提供的命令 \enquote* 的左引号(以及分别为 ‘)?


    – 

  • 1
    @elmo 查看编辑。


    – 

  • @egreg 对不起,你被抢了


    – 

为了多样性,这里使用基于 LuaLaTeX 的解决方案。注意,因为\Quoted使用了 Lua 自己的string.rep函数,所以不需要执行循环操作。

% !TEX TS-program = lualatex
\documentclass{article}

\newcommand{\Quoted}[2][1]{\directlua{tex.sprint ( 
    string.rep ("\\mbox{`}",#1) .. "#2" .. string.rep ("\\mbox{'}",#1) 
    )}}

\begin{document}
\Quoted{abc}

\Quoted[2]{abc}

\Quoted[10]{abc}
\end{document}

3

  • 嗯,严格来说,David 的回答也不涉及 TeX-loop。


    – 

  • @Skillmon – 谢谢。我的评论旨在对 OP 的标签使用进行注释loops。我想我可以更清楚一点… 考虑到循环这个话题,我想我真的不知道 Lua 如何实现这个string.rep函数——它可能涉及执行 for 循环吗?


    – 


  • 1
    可能🙂 (更多字符)


    –