csvファイルの内容をコマンドの引数として扱う方法

csvファイルの内容をコマンドの引数として扱う方法

- puripuri2100 の投稿
返信数: 6
red, hoge
blue, fuga

などのように、colorとstringがたくさん並んでいるcsvファイルがあるのですが、これの中身を\textcolor{red}{hoge}のように、\textcolorコマンドの中に入れたいのですがどのようにすればよいでしょうか。

使うエンジンはLuaLaTeXの予定です。

texluaを使おうとしましたが、

for line in io.lines("hoge.csv") do
color, string = line:match("([^,]+), ([^,]+)")
token.hogehoge(textcolor, color, string)
end

とすると\textcolor{color}{string}が出てくれるようなhogehogeが見つからなかったので、できませんでした……。

やり方を教えていただけると嬉しいです。よろしくお願いします。
puripuri2100 への返信

Re: csvファイルの内容をコマンドの引数として扱う方法

- Z. R. の投稿

意図したものに一番近いのはtex.print()(またはtex.sprint())だと思います。

先ほど公開された「TeX & LaTeX Advent Calendar 2018」の記事に使用例があるので参考にするといいでしょう。

puripuri2100 への返信

Re: csvファイルの内容をコマンドの引数として扱う方法

- puripuri2100 の投稿
ZRさんやだめぽラボさんに教えていただいた方法で実現できたのですが、今度は読み込むファイルを指定したくなりましたが方法がよくわかりません。どのようにすれば良いでしょうか?

教えていただけると嬉しいです。
puripuri2100 への返信

Re: csvファイルの内容をコマンドの引数として扱う方法

- puripuri2100 の投稿
書き忘れていたのですが、できることならば以下のコードみたいな感じで、コマンドの引数としてファイル名を与えたら実行されるという形式にしたいのです。

\documentclass{article}
\usepackage{xcolor}
\usepackage{luacode}
\newcommand*{\csvcolor}[1]{\luaexec{textc(#1)}}

\begin{document}
%\directlua{dofile('textcolor.lua')}
\csvcolor{hoge.csv}
\end{document}
puripuri2100 への返信

Re: csvファイルの内容をコマンドの引数として扱う方法

- 阿部 紀行 の投稿
そこは通常のLaTeXコマンドと同様です.つまり
\newcommand{\csvcolor}[1]{%
\directlua{
for line in io.lines("#1") do
tex.print(line)
end
}%
}
と定義しておけば,\csvcolor{hoge.csv}が
\directlua{%
for line in io.lines("#1") do
tex.print(line)
end
}%
に展開されます.Luaコードを外部ファイルに分離しておきたい場合は,function csvcolor(file) ... endと関数で定義しておいて,
\newcommand{\csvcolor}[1]{\directlua{csvcolor("#1")}}
とすればよいでしょう.