如何让餐桌不再拥挤

如何让餐桌不再拥挤

我有一张使用定义的表etoolbox,但我不确定如何使它看起来不那么拥挤。

\documentclass{article}
\usepackage{calculator}
\usepackage{pgffor,etoolbox}

\begin{document}
\newcommand*\mytable{}
\foreach \i in {1,...,6}{
    \foreach \j in {1,...,6}{
        \ADD{\i}{\j}\sum
        \FRACTIONSIMPLIFY{\sum}{35}\num\div
        \xappto\mytable{
            $(\i,\j)\rightarrow\frac\num\div$
        }
    }
    \gappto\mytable{\\}
}

\begin{tabular}{c}
    \mytable
\end{tabular}
\end{document}

在此处输入图片描述

答案1

这是一个使用array环境而不是tabular环境的解决方案,并创建 6 个单独的左对齐列,其内容自动处于显示数学模式。

在此处输入图片描述

\documentclass{article}
\usepackage{calculator,pgffor,etoolbox}
\usepackage{array} % <-- new
\begin{document}
\newcommand*\mytable{}
\foreach \i in {1,...,6}{
    \foreach \j in {1,...,6}{
        \ADD{\i}{\j}\sum
        \FRACTIONSIMPLIFY{\sum}{35}\num\div
        \xappto\mytable{
            (\i,\j)\to\frac{\num}{\div}& % note: no $-symbols necessary
        }
    }
    \gappto\mytable{\\}
}

\[
\renewcommand\arraystretch{2.25}
\setlength\arraycolsep{4pt} % default: 5pt
\begin{array}{@{} *{6}{>{\displaystyle}l} l @{}}
    \mytable
\end{array}
\]
\end{document}

一些解释:

  • 开始和结束@{}粒子的意思是“没有空白填充”(在左侧和右侧边缘)。(严格来说,这些粒子是可选的。但是,我认为提供它们是很好的。)

  • *{6}{>{\displaystyle}l}意思是“创建 6 列类型>{\displaystyle}l”,即左对齐的列,其单元格自动处于显示样式数学模式。这很有用,因为\frac随后会生成“大”分数。

  • 最后一个l-type 列是“虚拟”列。其内容始终为空;但必须指定第 7 列,因为该(\i,\j)\to\frac{\num}{\div}&指令在每个输出字符串的末尾插入列分隔符&。由于 有 6 个实例&,因此必须设置 7(而不是 6)列。

答案2

尝试 Mico 的解决方案:如果分数条的长度相等,分数可以变得不那么参差不齐。所有分子和分母都有一位或两位数字。\mytwofrac如果只有一位数字,则宏会扩展分子和/或分母。以下示例假设数字的宽度不成比例,并且数字的宽度为 0.5em(为简单起见)。

\documentclass{article}
\usepackage{calculator,pgffor,etoolbox}
\usepackage{array} % <-- new
\begin{document}

\newcommand*{\mytwofrac}[2]{%
  \frac
  {\ifnum#1<10 \kern.25em#1\kern.25em\else#1\fi}%
  {\ifnum#2<10 \kern.25em#2\kern.25em\else#2\fi}%
}

\newcommand*\mytable{}
\foreach \i in {1,...,6}{
    \foreach \j in {1,...,6}{
        \ADD{\i}{\j}\sum
        \FRACTIONSIMPLIFY{\sum}{35}\num\div
        \xappto\mytable{
            (\i,\j)\to\mytwofrac{\num}{\div}&
        }
    }
    \gappto\mytable{\\}
}

\[
\renewcommand\arraystretch{2.25}
\setlength\arraycolsep{4pt} % default: 5pt
\begin{array}{@{} *{6}{>{\displaystyle}l} l @{}}
    \mytable
\end{array}
\]
\end{document}

结果

答案3

这是一个解决方案cellspace,它允许您定义最小以字母为前缀的列中单元格顶部和底部的垂直间距S(或者C如果您加载siunitx):

\documentclass{article}
\usepackage{calculator}
\usepackage{nccmath}
\usepackage{pgffor,etoolbox}
\usepackage{cellspace}
\setlength{\cellspacetoplimit}{6pt}
\setlength{\cellspacebottomlimit}{6pt}

\begin{document}

\newcommand*\mytable{}
\foreach \i in {1,...,6}{
    \foreach \j in {1,...,6}{
        \ADD{\i}{\j}\sum
        \FRACTIONSIMPLIFY{\sum}{35}\num\div
        \xappto\mytable{
            $(\i,\j)\rightarrow\frac\num\div$
        }
    }
    \gappto\mytable{\\}
}

\begin{tabular}{Sc}
    \mytable
\end{tabular}

\end{document} 

在此处输入图片描述

答案4

只是为了好玩,这里有一个单独的、基于 LuaLaTeX(或基于 LuaJITLaTeX)的答案。它设置了几个 Lua 函数来执行所有工作,包括分别将和等分数表达式简化为和\frac{10}{35}。因此,答案确实\frac{7}{35}\frac{2}{7}\frac{1}{5}不是需要pgfforcalculatoretoolbox包。

此外,array环境现在仅包含 6 列,即解决方案不需要第 7 个虚拟列(就像之前的一些答案中的情况一样)。另外,代码还采用了\mytwofracHeiko 的回答

由于输出与 Heiko 的答案完全一样,因此我只发布代码,而不发布屏幕截图。

首先,LaTeX 代码。

% !TEX TS-program = luajitlatex  % or: !TEX TS-program = lualatex
\documentclass{article}
\usepackage{array}
\newcolumntype{L}{>{\displaystyle}l} % left-aligned & displaystyle math mode
\newcommand{\mytwofrac}[2]{% cf. Heiko's macro at https://tex.stackexchange.com/a/433410/
   \frac{#1}{\ifnum#2<10\kern.25em#2\kern.25em\else#2\fi}}

\directlua{ dofile ( "aux.lua" ) } % load the Lua code from the external file

\begin{document}
\[
\renewcommand\arraystretch{2.25} % for a less-cramped look...
\setlength\arraycolsep{4pt} % default: 5pt
\begin{array}{@{} *{6}{L} @{}}
   \directlua{ makearray(6) } % 6: # of rows and columns in matrix
\end{array}
\]
\end{document}

第二,Lua 代码。将其保存到名为 的单独文件中aux.lua

--[[
5 Lua functions:

-   is_prime(n)
      Test whether an integer is prime
-   find_prime_factors(n)
      Find and return all prime factors of an integer
         If n=1 or if n is a prime number: return n 
         Otherwise, return the true prime factors
-   fraction_simplify(a,b)
      Simplify a fraction expression, by removing
         common prime factors in num. and denom.
      Input:  numerator and denominator (integers)
      Output: fully simplified num. and denom.
-   print_simplified_fraction(a,b)
      Print the result of 'fraction_simplify'
-   makearray()
      Interface to the LaTeX code
]]--

function is_prime(n)
-- Sieve of Erathosthenes method
   for i = 2, n^0.5 do 
      if n%i == 0 then
         return false
      end
   end
   return true
end

function find_prime_factors ( n ) -- n: integer (>0)
   prime_factors = {}  -- Initialize a Lua "table"
   if ( n==1 or is_prime(n) ) then
        -- There's just one factor: 'n' itself
      table.insert ( prime_factors , n )
   else -- There are at least two (nontrivial) factors      
      while ( n>1 ) do
         for i=2, n do
            if n%i==0 then
               table.insert(prime_factors,i)
               n=n/i
               break
            end
         end
      end
   end
   return prime_factors
end

function fraction_simplify ( a , b ) 
-- It is assumed that both 'a' and 'b' are integers
   if a==b then -- the greatest simplfication!
      return 1 , 1 
   else
      -- assume numerator term smaller than denominator
      if a<b then 
         u=a
         v=b
      else 
         u=b
         v=a
      end

      -- Obtain the prime factors of 'u' and 'v'
      ufactors = find_prime_factors ( u )
      vfactors = find_prime_factors ( v )

      -- Replace matching prime factors with ones
      for i,j in ipairs ( ufactors ) do
         for k,l in ipairs ( vfactors ) do
            if (j>1 and j==l) then 
               ufactors[i]=1
               vfactors[k]=1            
               break
            end
         end
      end

      -- Compute the fully-simplified fractional terms
      ux=1; vx=1
      for _,j in ipairs ( ufactors ) do 
         ux = ux * j 
      end
      for _,l in ipairs ( vfactors ) do 
         vx = vx * l 
      end

      if a<b then
         return ux, vx
      else
         return vx, ux
      end
   end    
end

function print_simplified_fraction ( x , y )
   u , v = fraction_simplify ( x , y )
   if v==1 then -- Print just the numerator
      tex.sprint ( u ) 
   else
      tex.sprint ( "\\frac{"..u.."}{"..v.."}" )
   end
end

function makearray ( k ) -- k: number of rows and columns
   for i = 1, k do
      for j = 1, k do
         n, d = fraction_simplify ( i+j , 35)
         tex.sprint ( "("..i..","..j..")\\to\\mytwofrac{"..n.."}{"..d.."}" )
         if j<k then
            tex.sprint ( "&" )
         else
            tex.sprint ( "\\\\" )
         end
      end
   end
end

上面的某些 Lua 函数(例如,is_prime测试素数以及find_prime_factors获取整数的素数因子的完整列表)可能也适用于其他设置。

相关内容