管理全般に関するフォーラム

XyMTeXによる化学構造式の表示

 
画像 T N
XyMTeXによる化学構造式の表示
 
はじめて書き込みします。よろしくお願いします。

XyMTeXによる化学構造式の表示ができないものかと思い、TeXのことがよく分からないにも拘わらず、無謀にも挑戦してみましたが、以下のようなエラーが出て頓挫しました。

/var/log/httpd/error_logのメッセージ:
/usr/bin/mktexfmt: line 334: /usr/share/texmf/texconfig/tcfmgr: Permission denied
fmtutil: config file `fmtutil.cnf' not found.
This is dvips(k) 5.96.1 Copyright 2007 Radical Eye Software (www.radicaleye.com)
/usr/bin/dvips: ! DVI file can't be opened.

/usr/bin/mktexfmtの334行目は
"$MT_TEXMFMAIN/texconfig/tcfmgr" "$@"
です。


解決のヒント、あるいは、そもそも無理というようなことでもかまいません。ご教授いただければ幸いです。システムの環境等は以下の通りです。よろしくお願いします。

  • Moodle の入手場所: moodle.org
  • バージョン: Moodle 1.9.9 (Build: 20100609)
  • PHP のバージョン: 5.3.3
  • Apacheのバージョン: 2.2.15
  • OS の種類とバージョン: Fedora 12(カーネル: 2.6.32.19-163.fc12.i686.PAE)

XyMTeXのインストール:
湘南情報数理科学研究所からダウンロードした xymtex406.zip を解凍し、xymtexディレクトリを/usr/share/texmf/tex に置きました。オーナー、グループ、パーミッションは
# ls -l /usr/share/texmf/tex
total 80
drwxr-xr-x. 4 root root 4096 2010-08-07 18:42 amstex
drwxr-xr-x. 12 root root 4096 2010-08-07 18:42 context

省略

drwxr-xr-x. 10 root root 4096 2010-08-07 18:43 xelatex
drwxr-xr-x. 11 root root 4096 2010-08-30 10:30 xymtex
です。このxmtexディレクトリに、epic.sty を以下のように置きました。
# ls -l /usr/share/texmf/tex/xymtex/epic.sty
-rw-r--r--. 1 root root 25797 2010-08-30 10:30 epic.sty
最後に、
# mktexlsr
を実行しました。

XyMTeXの動作確認:
まず、一般ユーザで次のようなファイルを作り、コマンドラインから一連の操作を行いました。
% cat example.tex
\documentclass[12pt]{article}
\usepackage{xymtex}
\begin{document}
\bzdrv{}
\tetrahedral{0==C;1==H;2==H;3==H;4==H}
\end{document}
% latex example.tex
% dvips example
できたPostScriptファイルを表示させて、ベンゼン環とメタンが正しく描かれていることを確認しました。

MoodleでのXyMTeXの利用:
管理:プラグイン:フィルタ:Tex表記法のLaTeXプリアンブルを
\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{xymtex}
\RequirePackage{amsmath,amssymb,latexsym}
としました。httpdをリスタート(不必要かもしれませんが)させた後、Moodle内で次のようなウェブページを作成しました。
<tex>\frac{6}{3}=2</tex><br>
<tex>\tetrahedral{0==C;1==H;2==H;3==H;4==H}</tex>
これを表示させますと、
\frac{6}{3}=2
[
\tetrahedral?]0==C;1==H;2==H;3==H;4==H
のように分数式は正しく表示されますが、化学構造式は正しく表示されず、冒頭のエラーメッセージが出力されました。LaTeXプリアンブルの最後を
\RequirePackage{amsmath,amssymb,latexsym,xymtex}
としても、同じ結果でした。

以上、よろしくお願いします。
 
評点平均: -
画像 T N
Re: XyMTeXによる化学構造式の表示
 
補足です。

fmtutil.cnfは、/usr/share/texmf/web2c に存在します。
tcfmgrのパーミッションは、
# ls -l /usr/share/texmf/texconfig/tcfmgr
-rwxr-xr-x. 1 root root 9245 2006-01-03 08:53 /usr/share/texmf/texconfig/tcfmgr
です。

訂正です。
>です。このxymtexディレクトリに、epic.sty を以下のように置きました。
1997年の頃の写真です
Re: XyMTeXによる化学構造式の表示
Translators

環境は全く違いますが,エラーは似ているということで以下のページを示します.
http://d.hatena.ne.jp/fukuit/20090401/1238672662

私はTeXのインストールには全く疎いので勘違いも多いと思います.もっと詳しい方々がきっと助けてくれるでしょう!

ユーザがコマンドラインでplatexを実行しても大丈夫だが,Moodle(Apache)が変換を行うとエラーになる.上記ページにもありますが,$MT_TEXMFMAIN が正しく設定されていないのではないでしょうか? たとえばT.Nさんはログイン時に環境変数を設定しているが,apacheはその設定を行っていないため$MT_TEXMAINが空である,という状況が思いつきます.

画像 T N
Re: XyMTeXによる化学構造式の表示
 
早速のご返信、ありがとうございます。
そのページは拝見しましたが、ちょっと状況が異なります。環境変数は、mktexfmt自体で取得するようになっていて、また、

/usr/bin/mktexfmt: line 334: /usr/share/texmf/texconfig/tcfmgr: Permission denied

のメッセージが示しているように、$SMT_TEXMFMAINは正しく展開されていると思っていました。ところが、今回試しに、334行目を

/usr/share/texmf/texconfig/tcfmgr "$@"

と書き換えて実行してみると、今度は、

kpathsea: Running mktexfmt latex.fmt
/usr/bin/mktexfmt: line 902: main: command not found
This is dvips(k) 5.96.1 Copyright 2007 Radical Eye Software (www.radicaleye.com)
/usr/bin/dvips: ! DVI file can't be opened. 
というメッセージが出力されました。902行目は、

main ${1+"$@"}

です。
やはり、環境変数がらみでしょうか。ただ、XyMTeXの動作確認を行った、一般ユーザもrootも、TeX関連の環境変数は何も設定していないので、どうも、よく分かりません。どうかお助けを。
1997年の頃の写真です
Re: XyMTeXによる化学構造式の表示
Translators
 あとは,Permission denied ということですので,Moodle(つまりapache)にそのファイルを閲覧する権限が設定されていない(グループ)のではないか?と.目的のフォルダやファイルのパーミッションおよびグループと所有者はどのように設定されているのか確認できませんか?
画像 T N
Re: XyMTeXによる化学構造式の表示
 
一応、関係ありそうなファイル、プログラム、およびその親ディレクトリのすべてのパーミッションを確認しましたが、プログラムとディレクトリなら誰からも 実行できる(755)、ファイルなら誰からも読める(644)となっていました。オーナーとグループはいずれもrootです。
1997年の頃の写真です
Re: XyMTeXによる化学構造式の表示
Translators

私の知識では完全にお手上げです.お力になれずに申し訳ありません.
どなたかもっとLinuxとTeXに詳しい方々,助力をお願いします.

画像 Haruhiko Okumura
Re: XyMTeXによる化学構造式の表示
Translators
いま出張中でiPadしかないのでテストできないのですが、一般論として、su apacheしてからコマンドで実行してみると、何か分かりそうな気がします。
画像 T N
Re: XyMTeXによる化学構造式の表示
 
以下のコマンドを実行してみました。

# cd /tmp
# mkdir apache
# chown apache.apache apache
# cd apache
# su apache --shell=/bin/bash --command="cp ~GeneralUser/example.tex ."
# su apache --shell=/bin/bash --command="latex example.tex"
# su apache --shell=/bin/bash --command="dvips example"

生成されたexample.psには、幸か不幸か、正常に化学構造式が描かれていました複雑な
画像 Haruhiko Okumura
Re: XyMTeXによる化学構造式の表示
Translators
実際のApacheのシェルもbashなんでしょうか。
画像 T N
Re: XyMTeXによる化学構造式の表示
 
なにしろapacheはnologinですから^_^;)
/usr/bin/mktexfmtの先頭が #!/bin/sh なのでbashを指定してみました。
tcshを指定しても結果は同じです。
画像 Haruhiko Okumura
Re: XyMTeXによる化学構造式の表示
Translators
bashとshでは実体は同じだけれど挙動は微妙に違うしスタートアップファイルもよくわかりませんが同じなんでしょうか。そちらからくるPATHなどが違ったりしないかと思ったのでした。

そもそもMoodleはどういうふうにTeXを起動するんでしょう。system()とかなんでしょうけれど、カレントディレクトリは? そこはwritable?

それにしても何かおかしい挙動をしていますね。MoodleのTeX起動部分のソースを見ないとよくわかりません。
画像 T N
Re: XyMTeXによる化学構造式の表示
 
# su apache --shell=/bin/bash --command="set|grep PATH"
BASH_EXECUTION_STRING='set|grep PATH'
PATH=/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/bin:/usr/bin

# su apache --shell=/bin/tcsh --command="set|grep path"
command set|grep path
path (/usr/lib/qt-3.3/bin /usr/kerberos/sbin /usr/kerberos/bin /usr/lib/ccache /usr/local/bin /bin /usr/bin)

# su apache --shell=/bin/tcsh --command="kpsewhich --var-value=TEXMFMAIN"
/usr/share/texmf

# su apache --shell=/bin/bash --command="kpsewhich --var-value=TEXMFMAIN"
/usr/share/texmf

こんな感じなので、pathは気にしなくてよい(TeX関連の一連のscript自体で定義するか取得する)のではないかと理解しています。

>それにしても何かおかしい挙動
ですね。
画像 T N
Re: XyMTeXによる化学構造式の表示
 
/moodle/filter/tex/latex.php によれば、データディレクトリが moodledata/temp/latex/
となっていて、writableです。TeXの呼び出しは、この辺りでしょうか?
// run latex on document

$command = "{$CFG->filter_tex_pathlatex} --interaction=nonstopmode $tex";
chdir( $this->temp_dir );

1997年の頃の写真です
Re: XyMTeXによる化学構造式の表示
Translators

 このところ,latexを使う機会が非常に少ないので間違っているかもしれません.

\documentclass[12pt]{article}
\usepackage{xymtex}
\begin{document}
\bzdrv{}
\tetrahedral{0==C;1==H;2==H;3==H;4==H}
\end{document}

こちらがコマンドラインで試したソースですよね.\usepackageの位置に注目.

 TeXフィルタのところで設定できるコードはfilters/tex/latex.phpのfunction construct_latex_document($fomula, $fontsize=12) の,$formulaであると仮定します.

        function construct_latex_document( $formula, $fontsize=12 ) {
            global $CFG;

            $formula = tex_sanitize_formula($formula);

            // $fontsize don't affects to formula's size. $density can change size
            $doc =  "\\documentclass[{$fontsize}pt]{article}\n";
            $doc .=  $CFG->filter_tex_latexpreamble;
            $doc .= "\\pagestyle{empty}\n";
            $doc .= "\\begin{document}\n";
//dlnsk            $doc .= "$ {$formula} $\n";
            if (preg_match("/^:space:*\\\\begin\\{(gather|align|alignat|multline).?\\}/i",$formula)) {
               $doc .= "$formula\n";
            } else {
               $doc .= "$ {$formula} $\n";
            }
            $doc .= "\\end{document}\n";
            return $doc;
        }

\begin{document]よりも後に追加されます.

つまりプリアンプルである以下のコードは\begin{document}の後でも支障が無いのか?ということです.

\usepackage[latin1]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{xymtex}
\RequirePackage{amsmath,amssymb,latexsym}

コマンドラインで試すLaTeXの文書でも同様にこれを\begin{document}の後に入れて,同じエラーが発生するならばこれが原因でしょう.

1997年の頃の写真です
Re: XyMTeXによる化学構造式の表示
Translators

 Moodleの側で試すのでしたら,

            // $fontsize don't affects to formula's size. $density can change size
            $doc =  "\\documentclass[{$fontsize}pt]{article}\n";
            $doc .=  $CFG->filter_tex_latexpreamble;
            $doc .= "\\pagestyle{empty}\n";
            $doc .= "\\begin{document}\n";
//dlnsk            $doc .= "$ {$formula} $\n";
            if (preg_match("/^:space:*\\\\begin\\{(gather|align|alignat|multline).?\\}/i",$formula)) {
               $doc .= "$formula\n";
            } else {
               $doc .= "$ {$formula} $\n";
            }
            $doc .= \\end{document}\n;

このコードの$doc .= "\begin{document}\n";よりも前の適当であると思われる箇所に\usepackageを追加してみてはどうでしょう?


画像 T N
Re: XyMTeXによる化学構造式の表示
 
管理:プラグイン:フィルタ:Tex表記法のLaTeXプリアンブルの記述は、
/moodle/filter/tex/filtersettings.php の
$items[] = new admin_setting_configtextarea('filter_tex_latexpreamble', get_string('latexpreamble','admin'),

filter_tex_latexpreambleに格納され、
latex.phpの

$doc = "\\documentclass[{$fontsize}pt]{article}\n";
$doc .= $CFG->filter_tex_latexpreamble;
$doc .= "\\pagestyle{empty}\n";
$doc .= "\\begin{document}\n";
//dlnsk $doc .= "$ {$formula} $\n";
if (preg_match("/^:space:*\\\\begin\\{(gather|align|alignat|multline).?\\}/i",$formula)) {
$doc .= "$formula\n";
} else {

で展開されるのではないでしょうか。したがって、コマンドラインで試した順番と同じであると思います。formulaは正に式そのもので、<tex>〜</tex>で挟まれる部分ではないでしょうか。

ところが、実際に試してみると、
1. 管理:プラグイン:フィルタ:Tex表記法のLaTeXプリアンブルから\usepackage{xymtex}を削除。
2. latex.phpの適当な位置に $doc .= "\\usepackage{xymtex}\n"; を挿入
3. 位置を変えて確認
4. イコールの前のドット(.=)の意味が分からないので、イコールだけにして再度確認

結果は、どこに置いても、
kpathsea: Running mktexfmt latex.fmt
/usr/bin/mktexfmt: line 902: main: command not found
でした。
しかも、Tex表記法のLaTeXプリアンブルにも、latex.phpのどこにもusepackage{xymtex}を書かなくても結局、上記のエラーとなりました。
どうも、usepackage{xymtex}は認識されていない、あるいはxymtexにたどり着いていない、という気がします。

なお、コマンドラインでは、documentclass, usepackage, begin{document}の順番を崩すとうまく行きません。
1997年の頃の写真です
Re: XyMTeXによる化学構造式の表示
Translators

おお!

$doc .= $CFG->filter_tex_latexpreamble;

を見落としていました! 失礼.

でもここにもしかしたらヒントがあるかも知れませんね.function render()の

            // turn the latex doc into a .tex file in the temp area
            $fh = fopen( $tex, 'w' );
            fputs( $fh, $doc );
            fclose( $fh );

でdie;して,出来上がったTeXソースをコマンドラインでlatexに掛けてどうなるか.

画像 T N
Re: XyMTeXによる化学構造式の表示
 
fcloseの後で、dieしてみますと、
/moodledata/temp/latex/d4adc490e27c70fca8a7b67b4cb78bbf.tex
ができていて、これをlatex, dvipsでPostScriptsにしてみますと、見事にメタンが描かれていました。
画像 T N
Re: XyMTeXによる化学構造式の表示
 
すみません。ちょっと見落としていたことがありまして。
管理:プラグイン:フィルタ:Tex表記法のLaTeXプリアンブルから\usepackage{xymtex}は削除したのですが、
\RequirePackage{amsmath,amssymb,latexsym,xymtex}
はそのまま残っていました。
/moodledata/temp/latex/d4adc490e27c70fca8a7b67b4cb78bbf.tex
には、このRequirePackageが書かれていました。usepackageかRequirePackageのどちらかが有効になっていれば良いようです。
画像 T N
Re: XyMTeXによる化学構造式の表示
 
ちょっと、恥ずかしい、自己フォローです。どうして最初に、/var/log/messagesを見なかったのか、ということになりますが・・・・

# chcon -R -t httpd_sys_content_t '/var/lib/texmf'

で、すべてが解決しました。いろいろ、お騒がせしました。SELinuxをenabled, disabledの両方で確認したつもりになっていたようですが、今となっては、記憶が曖昧です。何かおかしい、と指摘を受けた時点で気づくべきでした。

いずれにしろ、XyMTeXで構造式が描けました。皆様、ありがとうございました。
これで、自信を持って、有機系の人にもMoodleを薦めることができます。
画像 Haruhiko Okumura
Re: XyMTeXによる化学構造式の表示
Translators
よかったですね。私も昔SELinuxにはさんざん悩まされ,今ではまず最初にこの機能を切ることにしています。
1997年の頃の写真です
Re: XyMTeXによる化学構造式の表示
Translators
 ご苦労様でした.
 これで一安心ですね.

 今回の件はこれでひと段落となりそうです.さて,なかなか得られる情報の多い展開になりました.このディスカッションの内容は,どのフォーラムが適切なのか判断が少々難しい→管理全般に関するフォーラムに移動しようと思います.
1997年の頃の写真です
Re: XyMTeXによる化学構造式の表示
Translators

全般的日本語フォーラムより移動しました.

画像 T N
Re: XyMTeXによる化学構造式の表示
 

久しぶりに texlive をフルインストール(# dnf install texlive-scheme-full)してみたら、中に xymtex 5.06 が入っていました驚き

   texlive-xymtex-svn32182.5.06-19.fc23.noarch

です。これで面倒が少なくなりました。

以下は、MathJaxを使わないことが前提の、TeX表記法です。