根据经验法则分割线并显示结果的一般方法

根据经验法则分割线并显示结果的一般方法

以下是构建正确采样结果的频率概念的图示(如果存在这样的频率)。手动进行此类图示非常繁琐,而且容易出错……因此最好制作一对宏,并根据它们制作一个执行以下操作的宏:

假设我有一段包含 2 个或更多任意字母或数字的文本,

愛克斯

如何制作一个根据以下规则拆分一行文本的宏:

如果宏的参数是 2,则取出每对字母中的第二个字母并将它们并列。这是第 2 行。从原始行中删除这些字母,剩余部分为第 1 行。显示所有 2 行。

如果宏的参数是 3,则取出每个三元组中的第二个字母并将它们并列。这是第 2 行。取出每个三元组中的第三个字母并将它们并列。这是第 3 行。从原始行中删除这些字母,剩余部分为第 1 行。显示所有 3 行。

如果我写

\brk{+}{1}{axaaxxaaaxxaaaxxaaaaxxaxa}

等效的手动代码是

\begin{equation}
    \textrm{axaaxxaaaxxaaaxxaaaaxxaxa}
\end{equation}

如果我写

\brk{+}{2}{axaaxxaaaxxaaaxxaaaaxxaxa}

等效的手动代码是

\begin{equation}
    \textrm{aaxaaxaxaaxaa}
\end{equation}
\begin{equation}
    \textrm{xaxaxaaxaaxx}
\end{equation}

如果我写

\brk{+}{3}{axaaxxaaaxxaaaxxaaaaxxaxa}

等效的手动代码是

\begin{equation}
    \textrm{aaaxaxaxa}
\end{equation}
\begin{equation}
    \textrm{aaaxaxaxa}
\end{equation}
\begin{equation}
    \textrm{axxaxaaaa}
\end{equation}

等等。

现在 - 参数选择宏的第二个版本并逆转此行为。

如果我写

\brk{-}{1}{axaaxxaaaxxaaaxxaaaaxxaxa}

等效的手动代码是

\begin{equation}
    \textrm{axaaxxaaaxxaaaxxaaaaxxaxa}
\end{equation}

如果我写

\brk{-}{2}{aaxaaxaxaaxaa}{xaxaxaaxaaxx}

等效的手动代码是

\begin{equation}
    \textrm{axaaxxaaaxxaaaxxaaaaxxaxa}
\end{equation}

如果我写

\brk{-}{3}{aaaxaxaxa}{aaaxaxaxa}{axxaxaaaa}

等效的手动代码是

\begin{equation}
    \textrm{axaaxxaaaxxaaaxxaaaaxxaxa}
\end{equation}

等等。

是的,将结果格式化为特定环境(例如方程式环境)或更改 n 行的字体或垂直间距的能力\{brk{+/-}{n}{axaaxxaaaxxaaaxxaaaaxxaxa很重要,因为这是为了图形目的。希望有一种方法可以让它不成为宏的问题。

顺便说一下,结果是这样的:如果弦足够长,并且趋向于 x 的频率,比如说,x 是 1/3(当且仅当原始弦是随机采样的,因为对于大多数科学目的来说,它必须是随机采样的),那么根据任何经验法则,在由它组成的两个、三个或更多弦中,x 的频率也很快趋向于 1/3。如果我们从同一总体中抽取三个部分,每个部分都趋向于 x 的频率为 1/3,然后根据任何系统规则将弦加在一起,x 的频率又趋向于 1/3。

答案1

如果我理解您的愿望,您需要使用以下宏:

\newcount\tmpnum
\def\sedef#1{\expandafter\edef\csname#1\endcsname}
\def\expandcsname#1{\expandafter\ifx\csname#1\endcsname\relax \else \csname#1\endcsname\fi}

\def\brk#1#2#3{\bgroup\def\brkLines{#2}\ifx+#1\tmpnum=0 \brkA#3{}%
   \else\tmpnum=1 \def\brkF{}\def\tmp{\brkC{#3}}\expandafter\tmp\fi
}
\def\brkA#1{\ifx$#1$\expandafter\brkB\else 
   \advance\tmpnum by1   
   \ifnum\tmpnum>\brkLines \tmpnum=1 \fi
   \sedef{brk:\the\tmpnum}{\expandcsname{brk:\the\tmpnum}#1}%
   \expandafter\brkA \fi
}
\def\brkB{\tmpnum=0
   \loop
      \advance\tmpnum by1
      $$\hbox{\csname brk:\the\tmpnum\endcsname}$$
      \ifnum\tmpnum<\brkLines\relax \repeat
   \egroup
}
\def\brkC #1{%
   \sedef{brk:\the\tmpnum}{#1}%
   \ifnum\tmpnum<\brkLines\relax \advance\tmpnum by1 \expandafter\brkC
   \else \expandafter\brkD \fi
}
\def\brkD{\tmpnum=0
   \loop
      \advance\tmpnum by1
      \ifnum\tmpnum>\brkLines \tmpnum=1 \fi
      \expandafter\ifx\csname brk:\the\tmpnum\endcsname \empty \tmpnum=0
      \else
         \edef\tmp{\csname brk:\the\tmpnum\endcsname}%
         \expandafter \brkE \tmp \brkF
      \fi 
      \ifnum\tmpnum>0 \repeat
   $$\hbox{\brkF}$$
   \egroup
}
\def\brkE#1#2\brkF{\edef\brkF{\brkF#1}\sedef{brk:\the\tmpnum}{#2}}


\brk{+}{3}{123abcuvw} % --> 1au // 2bv // 3cw

\brk{-}{3}{123}{abc}{uvw}  % --> 1au2bc3cw

\brk{+}{3}{axaaxxaaaxxaaaxxaaaaxxaxa}

\brk{-}{3}{aaaxaxaxa}{aaaxaxaxa}{axxaxaaaa}

简要概括一下它是如何工作的。如果参数是(分成多行),则宏执行;如果\brk参数是(合并为一行),则宏执行。\brkA+\brkC-

\brkA循环从输入流中逐个读取标记并将其附加到宏中,其中\brk:num通过num执行结束1,2,3,...,\brkLines, 1,2,3,...,\brkLines,...etc.:它在显示行中打印从一到的宏内容。\brkA\brkB\brk:num\brkLines

逆向处理由 完成,\brkC将 n 个参数(n= \brkLines)存储到宏中\brk:num并执行\brkD。此宏执行循环,从 读取并删除第一个标记\brk:num,其中num直到第一个这样的宏为空。读取的标记在 的帮助1,2,3,...,\brkLines,1,2,3,...,\brkLines,etc.下累积到。最后将打印在显示行中。\brkF\brkE\brkF

答案2

这是一个应用expl3:对于拆分,我会循环输入字符串中请求的次数,挑选与循环相对应的项目并形成一个序列;对于重建,它只是相反的:我循环序列元素,从每个项目中挑选第一个元素、第二个元素等等。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\breakstring}{mm}
 {
  \guido_breakstring:nn {#1} {#2}
 }
\NewDocumentCommand{\rebuildstring}{m}
 {
  \guido_rebuildstring:n { #1 }
 }

\int_new:N \l_guido_columns_int
\seq_new:N \l_guido_strings_seq
\tl_new:N \l_guido_temp_tl

\cs_new_protected:Npn \guido_breakstring:nn #1 #2
 {
  \seq_clear:N \l_guido_strings_seq
  \int_step_inline:nnnn { 1 } { 1 } { #1 }
   {
    \int_zero:N \l_guido_columns_int
    \tl_clear:N \l_guido_temp_tl
    \tl_map_inline:nn { #2 }
     {
      \int_incr:N \l_guido_columns_int
      \int_compare:nT { \l_guido_columns_int == ##1 }
       {
        \tl_put_right:Nn \l_guido_temp_tl { \mathrm{####1} }
       }
      \int_compare:nT { \l_guido_columns_int == #1 }
       { \int_zero:N \l_guido_columns_int }
     }
    \seq_put_right:NV \l_guido_strings_seq \l_guido_temp_tl
   }
  \begin{gather*}
  \seq_use:Nn \l_guido_strings_seq { \\ }
  \end{gather*}
 }

\cs_new_protected:Npn \guido_rebuildstring:n #1
 {
  \seq_set_split:Nnn \l_guido_strings_seq { ; } { #1 }
  \tl_set:Nx \l_guido_temp_tl { \seq_item:Nn \l_guido_strings_seq { 1 } }
  \int_set:Nn \l_guido_columns_int { \tl_count:N \l_guido_temp_tl }
  \tl_clear:N \l_guido_temp_tl
  \int_step_inline:nnnn { 1 } { 1 } { \l_guido_columns_int }
   {
    \seq_map_inline:Nn \l_guido_strings_seq
     {
      \tl_put_right:Nx \l_guido_temp_tl { \exp_not:N \mathrm{ \tl_item:nn { ####1 } { ##1 } } }
     }
   }
  \begin{equation*}
  \tl_use:N \l_guido_temp_tl { \\ }
  \end{equation*}
 }

\ExplSyntaxOff

\begin{document}
\breakstring{3}{12312312312}

\rebuildstring{1111;2222;333}

\section{Split}

One:
\breakstring{1}{axaaxxaaaxxaaaxxaaaaxxaxa}
Two:
\breakstring{2}{axaaxxaaaxxaaaxxaaaaxxaxa}
Three:
\breakstring{3}{axaaxxaaaxxaaaxxaaaaxxaxa}

\section{Rebuild}

One:
\rebuildstring{axaaxxaaaxxaaaxxaaaaxxaxa}
Two:
\rebuildstring{aaxaaxaxaaxaa;xaxaxaaxaaxx}
Three:
\rebuildstring{aaaxaxaxa;xxaxaaaa;axaaxaxx}

\end{document}

在此处输入图片描述

相关内容