布尔参数的数量(无限)

布尔参数的数量(无限)

我想知道是否有可能编写一个函数,使其可以无限次地接受给定的符号。我想到的应用程序如下。如果可能的话,我想要一个命令,\spac该命令将采用两个布尔值,并且默认定义为\vspace*{0.5ex}

它需要两个符号。

  • 表示*是否有换行符;因此, \spac* 定义为\\[0.5ex]

  • 一个 的存在,+就意味着会有一个0.5ex \vspace increment

  • 这里的特殊性是,我们应该能够添加+任意数量的,或者,如果不可能(这是问题的一部分,确定是否可能),则可以添加相当多的数量,例如 5 或 6。

总而言之,每个+都会增加0.5ex总垂直空间。因此,垂直空间将始终等于0.5*(n+1)exn象征着 s 的数量+

我希望+(s) 能够直接书写而不使用分隔符,就像t+参数类型一样。

例子:

  • \spac+++++将产生一个垂直空间 (vspace) 0.5*6 = 3ex,没有换行符。
  • \spac*++将产生一个换行符和一个 vspace 0.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

在此处输入图片描述

相关内容