FC2ブログ
Latex ~pdf作成できない!~

こんにちは!レポート作成にはLatexとWinshellを使っている管理人です。
レポート締め切り間際は慌ただしくなることがたまにありますが、そんな忙しい時になんとdviファイルからpdfが作成できないというトラブルが発生してしまいました。
その時はdviを一度xpsに変換してそれを更にpdfに変換するという方法で乗り切ったのですが、さすがに毎回その手順を踏むのはシンドいので、解決策を真剣に探してみて、解決したので以下にまとめていきます。

使用環境及び症状

私が遭遇した症状と、それが発生した環境は以下の通りです。

原因究明

さて、先ほど書いたように、エラーメッセージが出ていないため一体どこから手をつけようかと考えてみました。
dviは作成されて、pdfが作成されないことから、問題はdvipdfmxにあることが容易に想像出来ます。あとは詳細なエラーメッセージをどうやって手に入れるかです。

texコンパイル時に作成される.log ファイルを覗いてみましたが、関係のありそうなログは出力されていません。
そこでdvipdfmxをコマンドラインから起動することを考えてみました。

コマンドラインに以下のように入力します。


dvipdfmx "yourDviFileName.dvi"

yourDviFileNameの部分はご自身のdviファイル名に書き換えてください。これを実行すると以下の様なエラーメッセージが得られました。


1: C:\Documents and Settings\○○○\デスクトップ\check2>dvipdfmx -vv sample.dvi

2: <FONTMAP:psbase14.map><FONTMAP:dvipdfm.map><FONTMAP:cid-x.map>sample.dvi -> sample.pdf

3: DVI Comment: TeX output 2014.01.06:0839

4: <AGL:texglyphlist.txt><AGL:pdfglyphlist.txt><AGL:glyphlist.txt>[1(Image:tiger.ep

5: s[./tiger.eps][PS]

6: pdf_image>> Converting file "./tiger.eps" --> "C:/DOCUME~1/○○○/LOCALS~1/Temp/

7: dvipdfm-x.234052393bb13aa2f57d430326714f32" via:

8: pdf_image>> rungs -q -dNOPAUSE -dBATCH -dEPSCrop -sDEVICE=pdfwrite -dCompatibi

9: lityLevel=%v -dAutoFilterGrayImages=false -dAutoFilterColorImages=false -dGrayIm

10: ageFilter=/FlateEncode -dColorImageFilter=/FlateEncode -dUseFlateCompression=tru

11: e -sOutputFile='%o' -c .setpdfwrite -f '%i' -c quit

12: pdf_image>> ...GPL Ghostscript 9.10: **** Could not open temporary file ''

13: **** Unable to open the initial device, quitting.

14:

15: ** WARNING ** Filtering file via command -->rungs -q -dNOPAUSE -dBATCH -dEPSCrop

16: -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dAutoFilterGrayImages=false -dAutoF

17: ilterColorImages=false -dGrayImageFilter=/FlateEncode -dColorImageFilter=/FlateE

18: ncode -dUseFlateCompression=true -sOutputFile='C:/DOCUME~1/○○○/LOCALS~1/Temp/

19: dvipdfm-x.234052393bb13aa2f57d430326714f32' -c .setpdfwrite -f './tiger.eps' -c

20: quit<-- failed.

21: ** WARNING ** Image format conversion for "./tiger.eps" failed...

22: ,Page:1)

23: ** ERROR ** pdf_ref_obj(): passed invalid object.

24:

25: Output file removed.

ちなみに自分が得た実際のエラーメッセージをコピーし損ねたので、上のエラーメッセージはこちらのページから拝借しました。

このメッセージからghostscriptの実行が上手くいってないということがわかります。(12行目あたりより。)

ここまでわかれば解決策に辿り着けそうです。

解決策

この問題を解決するために以下の手順を行いました。

  • C:\temp というフォルダが無ければ作成する。
  • ユーザー環境変数のTEMP,TMP,TMPDIRにC:\tempを指定する。%USEPROFILE~的な変数が指定されていたらそれと書き換える。

環境変数の変え方について分からない人は、私の以前の記事のPathの部分をTMPとかに読み替えていただければいいと思います。

上記手順を実行したところ、きちんとpdfが作成されるようになりました!
どうもghostscriptはUSERPROFILE以下にあるディレクトリが一時ファイルディレクトリに割り当てられていると、失敗することが多いようです。
これで安心してレポートが書けます笑

今回の問題を解決するにあたって、こちらのページを参考にさせていただきました。ありがとうございます。

スポンサーサイト



テーマ:トラブル - ジャンル:コンピュータ

[2014/03/29 19:37] | latex | トラックバック(0) | コメント(0) | page top
Windows8.1 explorer.exe クラッシュ!

こんにちは!Windows8.1がリリースされてすぐに更新して使っている管理人です。
Windows8シリーズ、大変使いやすいのですが、非常に困った問題が発生しておりました。

ファイルエクスプローラーで右クリックできない。。。

具体的に申しますと、皆さんがファイルをブラウズする時に使う explorer.exe で右クリックするとPCがビジー状態になってexplorer.exeが強制終了するという問題でした。
右クリックが出来ないともう色々手軽に出来なくて大変困っていました。

何か解決策が無いかと色々探していましたが、いまいちこれといったものがわからず、数ヶ月間ぐらいこの問題を放置していました。
しかしついに我慢の限界に達し、本格的に調べたところ以下のページに辿り着きました。

Windows 8.1 right crash?

このページの回答によると、AUTODESK Inventor が入っていると、右クリックするとexplorer.exe が強制終了するようです。


かくいう私も工学部の端くれ、PCに Inventorが入っておりました。これをアンインストールしたところ、見事右クリック出来るようになりました!
とてもいい気分です笑 もし同様の症状でお困りの方がいらっしゃいましたらInventorがPCにインストールされていないか確認してみてください。

もしInventorがインストールされてなくて同様の症状が出ている方は、「explorer.exe right click Windows 8.1」 なるキーワードで検索すると日本語で検索するよりは解決策が引っかかる可能性が上がると思います。英語が苦手だと思っている方も、これを機会に英語検索デビューしてみてはいかがでしょうか?笑

テーマ:トラブル - ジャンル:コンピュータ

[2014/03/21 09:55] | パソコン全般 | トラックバック(0) | コメント(0) | page top
CSVから数値データを読み込みたい! ~C++編~

CSVこんにちは!最近CSVファイルをいじることの多い管理人です。皆さんもCSVファイルからデータを読みだして、プログラムで使いたい!ということがあると思います。今回はC++でCSVファイルからテキストを読みだして数値として計算で使う方法についてご紹介したいと思います。

ソースコード

何はともあれ、ソースコードを見てください。


#include <string>
//stringstream を使うためにインポート

#include <sstream>
//ifstreamを使うためにインポート

#include <fstream>
using namespace std;
int main(int argc,char *argv[])

{

string str;

stringstream ss;

//以下のifstreamによって、csvFileNameに指定されたファイルが開かれます。

//今回は5行5列のCSVファイルを想定します。

//以下のように格納されてるイメージ。

/*

* 1,2,3,4,5

* 6,7,8,9,10

* 11,12,13,14,15

* 16,17,18,19,20

* 21,22,23,24,25

*/

ifstream csvFile(csvFileName);

//以下の配列に5行5列のCSVファイルの数値データを格納します。

double csvData[25];

//5行分の読み出し。

for (int row = 0; row < 5; row++)

{

//4列分読み出し。

for (int col = 0; i < 4; col++)

{

//gelineの第1引数は読み出し開始位置を表します。

//以下のコードの第1引数は現在の読み出し位置を表します。

//第2引数は読み出し先を指定します。

//第3引数は終端とする文字を指定します。

getline(csvFile.seekg(0,ios_base::cur),str,',');

//stringstreamに読みだしたstringを流す。

ss.str(str);

//stringstreamから配列に流す。

//この時にstring型からdouble型の変換が暗黙的に行われる。

ss>>csvData[5*row+col];

//stringstreamを以下の2行のコードでクリアする。

//これを行わないと前の文字が残って想定通りの数値が配列に格納できない。

ss.str("");

ss.clear(stringstream::goodbit);

}

//改行コードまで読み込む。すなわち一番最後の列の数値を読み込む。

getline(csvFile.seekg(0,ios_base::cur),str,'\r');

ss.str(str);

ss>>csvData[5*row+4];

ss.str("");

ss.clear(stringstream::goodbit);

}

//CSVファイルを閉じてファイルへのアクセス権を開放する。

csvFile.close();

}

以上のコードでCSVファイル内のデータ(今回は25個)が先頭から順番にdouble型の1次元配列に読み込まれました!これでプログラム内でCSVファイルの数値データを自由に使えます。

今回のCSVファイルからのデータの読み出しのポイントはgetline関数による読み出し位置合わせです。


getline(csvFile.seekg(0,ios_base::cur),str,',');

及び


getline(csvFile.seekg(0,ios_base::cur),str,'\r');

とfor文等を組み合わせることによって読み出し開始位置を自由に移動出来ます。イメージとしてはテキストエディタでCSVファイルを開いて、矢印キーでカーソルの位置を変えるようなカンジです。

こんなカンジで簡単にCSVファイルをC++で読み出せるので、是非試してみてください!

[2014/03/13 20:35] | プログラミング全般 | トラックバック(0) | コメント(0) | page top
| ホーム |