我正在尝试寻找一个 LaTeX 命令,允许我在给定文本周围重复指定字符(如引号)一定次数。例如,我想定义一个命令\quote[n]{y}
,如 ,它将输出文本 周围字符(在本例中为引号)的n 次y
重复。
是否有一个带有命令的软件包可以完成这项工作?如果没有,我该如何定义它?
请注意,在 LaTeX 中,重复n 次引号意味着左侧的左引号(即 )重复n`
次,右侧的右引号(即 )重复n 次'
。或者,也可以重复n 次命令\enquote{}
,并进行适当的调整(每次重复应仅包含一对简单引号)。
OP 编辑:有没有办法,而不是将 ` 放在左边,以指示 csquotes 包提供的命令 \enquote* 的左引号(分别表示 ‘)?我这样说是因为我也希望它能适应其他语言,比如德语。
3
最佳答案
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有可能🙂 (更多字符)
–
|
pgffor
。–
–
–
|