我有一张使用定义的表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}
不是需要pgffor
、calculator
和etoolbox
包。
此外,array
环境现在仅包含 6 列,即解决方案不需要第 7 个虚拟列(就像之前的一些答案中的情况一样)。另外,代码还采用了\mytwofrac
在Heiko 的回答。
由于输出与 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
获取整数的素数因子的完整列表)可能也适用于其他设置。