以下是构建正确采样结果的频率概念的图示(如果存在这样的频率)。手动进行此类图示非常繁琐,而且容易出错……因此最好制作一对宏,并根据它们制作一个执行以下操作的宏:
假设我有一段包含 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}