用素数枚举

用素数枚举

我在 中制作了一个编号列表LaTeX,但我想知道是否可以将列表中的数字设为素数。所以我想要类似的东西:

2. List item
3. List item
5. List item
7. List item

可以手动完成,但也可以自动化吗?

答案1

我采用了不同的方法,没有使用素数列表,而是使用 pgfmath 来查找素数。这很有趣。

\documentclass{article}

\usepackage{pgfmath}
\usepackage{enumitem}

\newcounter{primecnt}

\newcommand{\nextprime}{%\
    \loop
        \stepcounter{primecnt}%
        \pgfmathsetmacro{\primeTF}{isprime(\theprimecnt)}%
    \ifnum\primeTF=0
        \repeat
}

\newlist{primeenumerate}{enumerate}{1}
\setlist[primeenumerate]{label=\theprimecnt.}

\makeatletter
\newenvironment{primeenum}{%
    \setcounter{primecnt}{0}%
    \def\item{%
        \nextprime
        \@inmatherr\item
        \@ifnextchar [\@item{\@noitemargtrue \@item[\@itemlabel]}%
    }%
    \begin{primeenumerate}
}{%
    \end{primeenumerate}
}
\makeatother

\begin{document}

\begin{primeenum}
\item one
\item two
\item three
\item four
\item five
\item six
\item seven
\item eight
\item nine
\item ten
\item eleven
\item twelve
\item thirteen
\item fourteen
\item fifteen
\item sixteen
\item seventeen
\end{primeenum}

\end{document}

结果:

素数枚举 2

欢迎提供有关如何改进此代码的指点...

答案2

这是一个enumitem具有特殊\AddEnumerateCounter输出的版本\primeenum,可以使用其label={\primeenum*.}样式。

基本上,它只是应用\ifcase... \or...\fi并列出一些不超过的素数59,但当然可以扩展。

\documentclass{article}

\usepackage{enumitem}


\makeatletter
\def\primeenum#1{\expandafter\@primenum\csname c@#1\endcsname}
\def\@primenum#1{%
  \ifcase#1
  \or
  2\or 3\or 5\or 7\or 11\or 13\or 17\or 19\or 23\or 29\or 31\or 37\or 41\or 43\or 47\or 53\or 59\else\@ctrerr\fi
}

\AddEnumerateCounter*{\primeenum}{\@primenum}{100}

\makeatother


\newlist{primenumerate}{enumerate}{1}
\setlist[primenumerate,1]{label={\primeenum*.}}


\begin{document}

\begin{primenumerate}
\item Foo
\item Bar
\item Is
\item Nice
\item Foo
\item Bar
\item Is
\item Nice
\item Foo
\item Bar
\item Is
\item Nice
\item Foo
\item Bar
\item Is
\item Nice
\end{primenumerate}


\end{document}

在此处输入图片描述

答案3

这个答案采用了 Christian 的出色答案(他因开发基本结构而受到赞扬),并对其进行了调整,使新素数的输入更加精简。它使用包\getargsC的宏readarray来获取空格分隔的列表,并将列表以罗马数字方式放入宏\argi\argii\argiii等中。这大大简化了 的定义,\primenum如下所示:\def\@primenum#1{\csname arg\romannumeral\the#1\endcsname}

结果是一样的。

\documentclass{article}
\usepackage{readarray, enumitem}
\makeatletter
\getargsC{2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53}
\def\@primenum#1{\csname arg\romannumeral\the#1\endcsname}
\def\primeenum#1{\expandafter\@primenum\csname c@#1\endcsname}
\AddEnumerateCounter*{\primeenum}{\@primenum}{100}
\makeatother
\newlist{primenumerate}{enumerate}{1}
\setlist[primenumerate,1]{label={\primeenum*.}}
\begin{document}
\begin{primenumerate}
\item Foo
\item Bar
\item Is
\item Nice
\item Foo
\item Bar
\item Is
\item Nice
\item Foo
\item Bar
\item Is
\item Nice
\item Foo
\item Bar
\item Is
\item Nice
\end{primenumerate}
\end{document}

答案4

只是为了好玩,一个版本要求 Pari-GP 使用函数增加素数列表nextprime

最终列表写在文件中.aux,因此可以在初始化时回收。请注意,如果列表必须变大,则需要 shell escape。当然,需要安装有效的 Pari-GP。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N \g_primecount_list_seq % the primes to use
\int_new:N \g_primecount_max_int  % how many primes we need

% initialize
\seq_gset_from_clist:Nn \g_primecount_list_seq
 {
  2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53
 }

% if necessary, ask Pari-GP to make the list larger
\AtBeginDocument
 {
  \int_compare:nT { \seq_count:N \g_primecount_list_seq < \g_primecount_max_int }
   {
    \prg_replicate:nn { \g_primecount_max_int - \seq_count:N \g_primecount_list_seq }
     {
      \int_set:Nn \l_tmpa_int { \seq_item:Nn \g_primecount_list_seq { -1 } }
      \tl_set_from_file:Nnn \l_tmpa_tl { \endlinechar=-1 }
       { "|echo~'nextprime(\int_eval:n { \l_tmpa_int + 1 })'|gp~-q" }
      \seq_gput_right:NV \g_primecount_list_seq \l_tmpa_tl
     }
   }
 }

% the primeenum environment
\NewDocumentCommand{\maxprime}{m}
 {
  \int_compare:nT { #1 > \g_primecount_max_int }
   {
    \int_gset:Nn \g_primecount_max_int { #1 }
   }
 }

\DeclareExpandableDocumentCommand{\primecount}{m}
 { % #1 is the name of a counter
  \int_compare:nTF { \value{#1} > \seq_count:N \g_primecount_list_seq }
   {
    ???
   }
   {
    \seq_item:Nn \g_primecount_list_seq { \value{#1} }
   }
 }
\NewDocumentCommand{\checkprimes}{}
 {
  \int_compare:nT { \value{enumi} > \seq_count:N \g_primecount_list_seq }
   {
    \iow_shipout:cx { @auxout } { \maxprime { \int_to_arabic:n { \value{enumi} } } }
   }
 }
\cs_new_protected:Nn \primecount_dump_list:
 {
  \iow_now:cx { @auxout }
   {
    \buildprimelist { \seq_use:Nn \g_primecount_list_seq { , } }
   }
 }
\NewDocumentCommand{\buildprimelist}{m}
 {
  \seq_gset_from_clist:Nn \g_primecount_list_seq { #1 }
 }
\AtEndDocument
 {
  \primecount_dump_list:
  \cs_set_eq:NN \maxprime \use_none:n
  \cs_set_eq:NN \buildprimelist \use_none:n
 }
\ExplSyntaxOff

\NewDocumentEnvironment{primeenum}{}
 {\enumerate\renewcommand{\theenumi}{\primecount{enumi}}}
 {\checkprimes\endenumerate}

\begin{document}

\begin{primeenum}
\ExplSyntaxOn
\prg_replicate:nn { 199 } { \item X }
\ExplSyntaxOff
\item\label{Y} Y
\end{primeenum}

\ref{Y} is the 200th prime

\end{document}

在此处输入图片描述

这是文件的内容.aux,该列表也可用于其他所呈现的实现。

\relax 
\buildprimelist {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223}
\newlabel{Y}{{1223}{8}}

相关内容