CLI-LaTeX-Table
view release on metacpan or search on metacpan
scripts/latextable view on Meta::CPAN
#!/usr/bin/perl -T
use v5.14 ; use strict ; use warnings ; # cpantersã®ã¬ãã¼ãã«ããã¨ã5.14ããåã¯NAã ã£ãã
use Getopt::Std ; getopts q['$/:=_#:0:13:9C:fjm:psw:x:H:] , \my%o ; # 5.
use utf8 ; # v5.6 ~
use Encode qw[ encode_utf8 decode_utf8 ] ; # v5.7 ~
use Term::ANSIColor qw [:constants ] ; $Term::ANSIColor::AUTORESET = 1 ; # v5.6 ~
$o{m} //= "1." ; # 表示æ¡å¤§ç LaTeX displaying magnification efficient.
$o{x} //= "0mm" ; # 大ããã®ãã¼ãã«ã®ã»ã³ã¿ãªã³ã°ã®ããã«ãå·¦å³ãåãåãé·ããæå®ããã
my $isep = $o{'/'} // "\t" ; # å
¥åã®åºåãæå
my $colspec = '' ; # LaTeXã®tableç°å¢ã®åæå® LaTeX table environment "column specifier"
my $rm = $o{0} if defined $o{0} ; # ãã¼ãã«ã®å¤ã§é¤å»å¯¾è±¡ã¨ãªãå¤ã®æ£è¦è¡¨ç¾
my %del ; # LaTeXã§ä½¿ããªãã³ãã³ãã®æå®ã
my @r3 = () ; # 3æ¡ã³ã³ãåºåãã«ãã¦å³å¯ãã«ãããåã®æå®ã Which columns are to be decimal being separated every 3 digits.
# 追å ã®æ°´å¹³ç·ã¨åç´ç·
my $hdash = qq[\\hdashline[1pt/1pt] % "\\hdashline[..]" requires "\\usepackcage{arydshln}"] ;
my $HL = ! exists $o{'#'} ? '' : $o{'#'} =~ /1/ ? "\\hline" : $o{'#'} =~ m/\./ ? $hdash : '' ;
my $VL = ! exists $o{'#'} ? '' : $o{'#'} =~ /1/ ? '|' : $o{'#'} =~ /\./ ? ';{1pt/1pt}' : ' ' ;
my $angle = $o{9} ? 90 : 0 ; # å
¨ä½ãå転ããå ´åã®æå® When -9 is specified, the entire table rotates in 90 degree.
my @out ; # $0ã®åºåæåå The output of this command is accumulated in this variable.
my $otfFlag = 0 ; # usepackage{otf} ãå¿
è¦ãã©ããã®ãã©ã°
& main ( ) ;
exit 0 ;
sub plain2latex ( $ ) {
local $_ = $_[0] ;
$otfFlag = 1 if m/\P{ascii}/ ; # <-- å
¨è§ãã¤ãã³ã®æã ãã«è¡¨ç¤ºããæ§ã«ããã®ããè¯ãã®ããç¥ããªãã
my $hlen = $o{H} if defined $o{H} ; # ããã·ã¥å¤ã®ãããª16鲿°ã®æååãé·ãå ´åã« $hlenæ¡ã«ç¸®ã㦠.. ãç¶ããã
s/(?<=[0-9a-f]{$hlen})[0-9a-f]+/../gi if defined $o{H} ; # <-- - (?<= ) ã§æ£è¦è¡¨ç¾ã®å¾èªã¿
# ãã«$æåé¢é£ The pre-processing of the character "$ dollar". The completion process will appear much later.
s|\G(.*?)\$|$1=\$\$=|g ; # ãã«æåã®åå¦çã\Gã¯æååã®å
é ããããã¯ä¿®é£¾å g ãã¤ãããã¿ã¼ã³ãããã³ã°ãçµäºããå ´æãè¨æ¶ãã¦ãããããã«ããã
# LaTeXä¸ã§ æ°å¼ç°å¢ãå©ç¨ãããã® Utilization of math formula env. of LaTeX for some specific characters such as \~!<>.
s/([\\\Q!~<>|"\E\x{FF0D}]+)/\$$1\$/g ; # 1. æ°å¼ç°å¢ã«ç§»è¡ãã¦ã ; \Qã¨\Eã®éã¯ãã¿ã¼ã³ã¡ã¿æåã®ç¡å¹åã
s/\\/\\backslash/g ; # 2. ããã¦ãã¾ãå
ã«ããã¯ã¹ã©ãã·ã¥ã«å¦çããã¦ãå¾ã®å¦çãç¶ãã
s/~/\\sim/g; # ãã«ã
s/\x{FF0D}/\Q\!\!\frac{}{{{}\atop{H}}}\!\!\E/g if $o{'_'} ; # å
¨è§ãã¤ãã³ã¯ãã®ä¸ã«ãH ãå°ããæ¸ã ; \N{FULLWIDTH HYPHEN-MINUS}
s/\ /\\scalebox{0.5}[0.5]{\$\\sqcup\$}/g if $o{'_'} ; # åè§ã¹ãã¼ã¹ã®å¼·èª¿ ;
s/\x{3000}/\\scalebox{1}[0.5]{\$\\sqcup\$}/g if $o{'_'} ; # å
¨è§ã¹ãã¼ã¹ ã¯ã -z æå®ã®å ´åãç¿ã®å½¢ã®ç·ãç½®ãããã\N{IDEOGRAPHIC SPACE}
# LaTeXä¸ã§ããã¯ã¹ã©ãã·ã¥ãä¼´ãã¹ãæåã®å¦ç : Treatments on characters requiring backslash in LaTeX.
s/(?=[\Q_%#&{}\E])/\\/g ; # (?= ) ã§æ£è¦è¡¨ç¾ã®å
èªã¿ _%#&{}
s/\^/\\^{}/g ;
# ãã«æåã®å¦ç The completion of dollar character.
s/=\$\$=/\\\$/g ; # ãã«æåã®å¦çã¯ããã§çµããã
# åè§ã«ãã®å¦ç Japanese Hankaku (half-width) Katakana letters. (I tried to found them in the A1 - DF from JISX0201.)
if ( $o{j} ) {
s/([。「」、・ヲァ-ッーア-ï¾ï¾ï¾]+)/\\scalebox{0.5}[1]{$1}/g ; # 次ã®2è¡ã¯ç¯å²æå®ã ã¨ãããã®ã§ã䏿åãã¤å¦çããã
y/。「」、・ヲァィゥェォャï½ï½®ï½¯ï½°ï½±ï½²ï½³ï½´ï½µï½¶ï½·ï½¸ï½¹ï½ºï½»ï½¼ï½½ï½¾ï½¿/ããããã»ã²ã¡ã£ã¥ã§ã©ã£ã¥ã§ãã¼ã¢ã¤ã¦ã¨ãªã«ãã¯ã±ã³ãµã·ã¹ã»ã½/ ;
y/ï¾ï¾ï¾ï¾ï¾ï¾
ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾ï¾/ã¿ããããããããããããããããã ã¡ã¢ã¤ã¦ã¨ã©ãªã«ã¬ãã¯ã³ãã/ ;
}
# åè§ãã¤ãã³ã§é£ç¶ãã¦ãããã®ã®å¦ç
s/-(?=-)/-{}/g ;
return $_ ;
}
sub main ( ) {
my $zflag = 0 ; # å
¨è§ç©ºç½ã®åå¨ãã©ã° ; $ex{' '} ã®ããã«ãã£ã¨æè»ã«ããããã
my $maxF = 1 ; # ãã£ã¼ã«ãæ°ã®æå¤§å¤ ; 0 ã§ã¯ç¡ãã¦1ã¨ãã訳ã¯å
¨ã¦ç©ºè¡ã§ã \begin{tabular}[l] ã¨lãæä½1åã¯å¿
è¦ãªãã
my $tailF = $o{'$'} ? $o{w} : -1 ;
my $HS = ' ' x 12 ; # åºåè¡ã®å
é ã®ã¹ãã¼ã¹ãã¬ã¤ã¢ã¦ãããããã«ãããã
@r3 = split /,/, $o{3} , -1 if $o{3} ; # ãªãã·ã§ã³ -3 ã«ã¤ãã¦ã®å¦ç
do { splice @r3, $_ , 1 , $1 .. $2 if $r3[$_] =~ m/(\d+)\.\.(\d+)/ } for reverse 0 .. $#r3 ;
grep { $_ -- } @r3 ;
binmode STDOUT, ":utf8" ;
$SIG{ALRM} = sub { print STDERR CYAN "Please enter a tabular text in TSV format..\n" if -t } ;
alarm 3 ;
my $alF = 1 ; # alarm ãç«ã¦ããä¸ãããããããã¨ã表ããã©ã°
while ( <> ) {
alarm 0 if $alF && $alF -- ; # <- if ã使ããã¨ã§ sleep 0ã®3ãã¤ã¯ãç§ãããæ¶è²»ã 0.03ãã¤ã¯ãç§ã«ç¸®ã¾ã
chomp ;
do { s/\s*$// ; if (/^$/) { $. -- ; next } } if $o{s} ; # -s æå®ã«ããæ«å°¾ã®ç©ºç½æåãåãé¤ãã
$_ = decode_utf8 ( $_ ) ; # <-ãæ¬å¼§ãå¤ããã確èª
$zflag = 1 if m/ã/ ; #å
¨è§ç©ºç½ \x{3000} ã®ãã§ãã¯
my @F = split /$isep/ , plain2latex ( $_ ) , $tailF ; # <--- ããã§ã³ã¢ã¨ãªãå¦ç
#$tailF //= @F ; # 1è¡ç®ã§è¨å®ãããã¨ã§ãLaTeXã³ã³ãã¤ã«æã«åæ°å¤åã§ã¨ã©ã¼ã«ãªããªãããã«ããã
splice @F , $o{w} if defined $o{w} ; # åæ°ã®æå¤§å¤ãæå®ãããå ´åã®ãåãåãã®å¦çã
$maxF = @F if @F > $maxF ;
grep { s/$rm//} @F[ $o{1} // 0 .. $#F ] if defined $o{0} and $. > 1 || ! $o{'='} ; # -0ã®å¦ç
grep { s/(?<=\d)(?=(\d\d\d)+($|\D))/,/g } @F[ (grep{$_< scalar @F} @r3) ] if $. > 1 || ! $o{'='} ; # æ°å¤3æ¡åºåãã®å¦ç
grep { $_ = "\\rotatebox{90}{$_}"} @F if $o{q[']} and $. == 1 ; # å
é è¡ãå転ãããå ´åã
push @out, $HS . (join ' & ' , @F ) . "\\\\" , "\n" ;
push @out, $HS , "\\hline\n" if $o{'='} && $.== 1 ; # 1è¡ç®ã¨2è¡ç®ã«æ¨ªã®ç½«ç·ãå
¥ããã
push @out , $HS.$HL."\n" if $HL ne '' and ! ( $o{1} && $. == 1 ) ;
} # while (<>)ã®çµãã
pop @out if $HS ne '' ; # -\# ãæå®ããã¦ããã¨ãã«ãæå¾ã® 横罫ç·ã¯åãæ¶ãã
( run in 1.127 second using v1.01-cache-2.11-cpan-df04353d9ac )