我想知道是否有可能编写一个函数,使其可以无限次地接受给定的符号。我想到的应用程序如下。如果可能的话,我想要一个命令,\spac
该命令将采用两个布尔值,并且默认定义为\vspace*{0.5ex}
。
它需要两个符号。
表示
*
是否有换行符;因此, \spac* 定义为\\[0.5ex]
。一个 的存在,
+
就意味着会有一个0.5ex \vspace increment
。这里的特殊性是,我们应该能够添加
+
任意数量的,或者,如果不可能(这是问题的一部分,确定是否可能),则可以添加相当多的数量,例如 5 或 6。
总而言之,每个+
都会增加0.5ex
总垂直空间。因此,垂直空间将始终等于0.5*(n+1)ex
,n象征着 s 的数量+
。
我希望+
(s) 能够直接书写而不使用分隔符,就像t+
参数类型一样。
例子:
\spac+++++
将产生一个垂直空间 (vspace)0.5*6 = 3ex
,没有换行符。\spac*++
将产生一个换行符和一个 vspace0.5*3 = 1.5ex
。
语境
\documentclass{article}
\usepackage{linguex}
\usepackage{etoolbox}
\NewDocumentCommand{\tslt}{m}{`#1'}
\makeatletter
\patchcmd{\a}{\ifnum\theExDepth=2\topsep .3\Extopsep\else\topsep 0pt\fi
\parsep\z@\itemsep\z@}
{\ifnum\theExDepth>1\topsep\csname pxtop\roman{ExDepth}\endcsname
\itemsep\csname pxitem\roman{ExDepth}\endcsname\else\topsep\z@\itemsep\z@\fi
\parsep\z@}{}{}
\makeatother
\newlength{\pxtopii}
\newlength{\pxtopiii}
\newlength{\pxitemii}
\newlength{\pxitemiii}
\newcommand{\spaceab}[1]{\setlength{\pxitemii}{#1}}
\newcommand{\spaceii}[1]{\setlength{\pxitemiii}{#1}}
\newcommand{\spacebefa}[1]{\setlength{\pxtopii}{#1}}
\newcommand{\spacebefi}[1]{\setlength{\pxtopiii}{#1}}
\newcommand{\alignright}{\hspace{1em}\raggedright\hspace*{\fill}}
\NewDocumentCommand{\web}{o}{%
\begingroup\alignright%
(\textsc{web}\IfValueT{#1}{,~#1})\endgroup\par}
\begin{document}
\spaceab{1ex}
\spacebefa{2ex}
\ex. Example 1\label{ex1}
\a. Sublevel1a\label{ex1a}\\
\tslt{translation 1a}
\b. Sublevel1b\label{ex1b}\\
\tslt{translation 1b}
\spaceab{2ex}
\spaceii{1ex}
\ex. Example 2\label{ex2}\\
\a. sublevel2a
\a. sublevel 2ai\\
\tslt{translation 2ai}
\b. sublevel 2aii
\tslt{translation 2aii}
\z.
\b. \a. sublevel 2bi\\
\tslt{translation 2bi}
\b. sublevel 2bii\\
\tslt{translation 2biii}
\b. sublevel 2biii
\tslt{translation 2biii}
\z.
\b. sublevel2c\\
\tslt{translation 2c}
\ex. Example XXXXX
\tslt{translation}\web\vspace*{1ex}
\end{document}
根据句子和翻译的重量以及整体外观,我会调整间距。翻译前的空格由某个 \vspace*{} 值指定。但换行符有时已由前一个命令指定(例如 \web),因此我不想系统地集成它。
答案1
以下日志
adding 2.15277pt
adding 4.30554pt
adding 75.34698pt
并产生
我根本没有使用*
表格,因为您需要处于垂直模式才能添加垂直空间。
\documentclass{article}
\newlength\spaclen
\NewDocumentCommand\spac{}{\par\setlength\spaclen{0.5ex}\innerspac}
\NewDocumentCommand\innerspac{t{+}}{%
\IfBooleanTF{#1}%
{\addtolength\spaclen{.5ex}\innerspac}%
{\typeout{adding \the\spaclen}\addvspace\spaclen}}
\begin{document}
aaa\spac b
aaa\spac+ b
aaa\spac++++++++++++++++++++++++++++++++++ b
\end{document}
答案2
因为我不明白为什么要在水平模式下插入垂直空格(即\spac
没有*
),所以我只向您展示无限参数的原理+
。当然,\par
宏开头的表示我们只会在垂直模式下插入空格。
或者你是指\vadjust
用法?这是 TeX 原语(用于 LaTeX \vspace
),这是许多 LaTeX 用户感到困惑的根源,所以我不会在\spac
宏中使用它。
\def\spac{\par \spacA+}
\def\spacA+{\vskip.5ex \futurelet\next\spacB}
\def\spacB{\ifx\next+\expandafter\spacA \fi}
% testing:
\hrule width1cm
\spac
\hrule
\spac+
\hrule
\spac++
\hrule
\spac++++++
\hrule
\bye
答案3
+
计算以下\spac
或的数量\spac*
。
+
我通过执行正则表达式搜索和替换来实现此目的。最后一个或单个后面的空格*
将被忽略。
\documentclass{article}
\usepackage{indentfirst}% just for alignment after \subsubsection
\ExplSyntaxOn
\NewDocumentCommand\spac{s}
{
\IfBooleanTF { #1 }
{
\peek_regex_replace_once:nn { (\+*)\s* } { \c{krebs_spac_break:n}\{\1\} }
}
{
\peek_regex_replace_once:nn { (\+*)\s* } { \c{krebs_spac_nobreak:n}\{\1\} }
}
}
\cs_new_protected:Nn \krebs_spac_break:n
{
\typeout{Adding~\inteval{\tl_count:n{#1}+1}ex}
\\[\inteval{\tl_count:n{#1}+1}ex]
}
\cs_new_protected:Nn \krebs_spac_nobreak:n
{
\typeout{Adding~\inteval{\tl_count:n{#1}+1}ex}
\vspace{\inteval{\tl_count:n{#1}+1}ex}
}
\ExplSyntaxOff
\begin{document}
\subsubsection*{zero}
aaa\spac b
aaa\spac* b
\subsubsection*{one}
aaa\spac+ b
aaa\spac*+ b
\subsubsection*{two}
aaa\spac++ b
aaa\spac*++ b
\subsubsection*{three}
aaa\spac+++ b
aaa\spac*+++ b
\end{document}
控制台输出(\typeout
说明仅针对此)
Adding 1ex
Adding 1ex
Adding 2ex
Adding 2ex
Adding 3ex
Adding 3ex
Adding 4ex
Adding 4ex
答案4
David Carlisle
的命令\innerspac
可以稍微修改一下,以支持减号-。
我们要做的就是检查-检查后签名+。只要找到两个符号中的一个,循环就会继续。当两个布尔值都为时,循环就会停止False
。
% !TEX TS-program = lualatex
\documentclass{article}
\newlength\spaclen
\NewDocumentCommand\spac{}{\par\setlength\spaclen{.5ex}\innerspac}
\NewDocumentCommand\innerspac{t{+}t{-}}{%
\IfBooleanTF{#1}{%
\addtolength\spaclen{.5ex}%
\IfBooleanTF{#2}{%
\addtolength\spaclen{-.5ex}}{}%
\innerspac}{%
\IfBooleanTF{#2}{%
\addtolength\spaclen{-.5ex}\innerspac}{%
\typeout{adding \the\spaclen}\addvspace\spaclen}}}
\begin{document}
aaa\spac b
aaa\spac+ b
aaa\spac- b
aaa\spac-- b
aaa\spac--- b
aaa\spac++++++++++++++++++++++++++++++++++ b
aaa\spac++--- b
aaa\spac+-+-+-+- b
\end{document}
日志(使用 LuaTeX 引擎):
- 添加 2.155pt
- 添加 4.31pt
- 加 0.0pt
- 添加 -2.155pt
- 增加 -4.31pt
- 添加 75.42496pt
- 加 0.0pt
- 添加 2.155pt