using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace vcsGRPARA_TeX { public partial class Form1 : Form { private string fnamedvi; public Form1() { InitializeComponent(); } //---------------------------------------------------------------------------- private void toolStripButton1_Click(object sender, EventArgs e) { main_part(); } //---------------------------------------------------------------------------- private void toolStripButton2_Click(object sender, EventArgs e) { string dvipath; //カレントフォルダを出力ファイルのフォルダにする dvipath = System.IO.Path.GetDirectoryName(fnamedvi); System.IO.Directory.SetCurrentDirectory(dvipath); //platex.exe実行 System.Diagnostics.Process.Start("c:\\usr\\local\\bin\\platex.exe", fnamedvi); } //---------------------------------------------------------------------------- private void toolStripButton3_Click(object sender, EventArgs e) { string dvipath; //dvipdfmによるpdf化 dvipath = System.IO.Path.GetDirectoryName(fnamedvi); fnamedvi = dvipath + "\\" + System.IO.Path.GetFileNameWithoutExtension(fnamedvi); fnamedvi = fnamedvi + ".dvi"; System.Diagnostics.Process.Start("c:\\usr\\local\\bin\\dvipdfm.exe", fnamedvi); } //---------------------------------------------------------------------------- private void toolStripButton4_Click(object sender, EventArgs e) { string pdfpath; //pdf表示 pdfpath = System.IO.Path.GetDirectoryName(fnamedvi); fnamedvi = pdfpath + "\\" + System.IO.Path.GetFileNameWithoutExtension(fnamedvi); fnamedvi = fnamedvi + ".pdf"; System.Diagnostics.Process.Start(fnamedvi); } //---------------------------------------------------------------------------- private void main_part() { //作図用変数宣言 double HSIZE; //画像横寸法(mm) double DHL; //画像左余白寸法:縦軸描画用(mm) double DHR; //画像右余白寸法(mm) double VSIZE; //画像縦寸法(mm) double DVL; //画像下余白寸法:横軸描画用(mm) double DVU; //画像上余白寸法(mm) string sxjiku; //x軸名(単位含む) double xmin; //x軸最小値 double xmax; //x軸最大値 double dx; //x軸増分 string slogx; //x軸の種類(L:対数,N:普通) string syjiku; //y軸名(単位含む) double ymin; //y軸最小値 double ymax; //y軸最大値 double dy; //y軸増分 string slogy; //y軸の種類(L:対数,N:普通) double kxi, kxf, kyi, kyf; double xx, yy, kxx, kyy, kxx1, kyy1, kxx2, kyy2; string str0, str1, str2, str3, str4; //入出力用変数宣言 System.IO.StreamReader sr; System.IO.StreamWriter sw; string dat; string[] sbuf; char delim=','; string fnameR=""; string fnameW=""; int nd; //データ組数−1 int md; //yデータ列数−1 int i, k; //データ読み込み openFileDialog1.InitialDirectory=System.IO.Directory.GetCurrentDirectory(); if(openFileDialog1.ShowDialog()==DialogResult.OK)fnameR=openFileDialog1.FileName; sr = new System.IO.StreamReader(fnameR, System.Text.Encoding.Default); dat = sr.ReadLine(); dat = sr.ReadLine();sbuf=dat.Split(delim);sxjiku = sbuf[0] ; syjiku = sbuf[1]; dat = sr.ReadLine();sbuf=dat.Split(delim);HSIZE = double.Parse(sbuf[0]) ; DHL = double.Parse(sbuf[1]) ; DHR = double.Parse(sbuf[2]); dat = sr.ReadLine();sbuf=dat.Split(delim);VSIZE = double.Parse(sbuf[0]) ; DVL = double.Parse(sbuf[1]) ; DVU = double.Parse(sbuf[2]); dat = sr.ReadLine();sbuf=dat.Split(delim);xmin = double.Parse(sbuf[0]) ; xmax = double.Parse(sbuf[1]) ; dx = double.Parse(sbuf[2]) ; slogx = sbuf[3]; dat = sr.ReadLine();sbuf=dat.Split(delim);ymin = double.Parse(sbuf[0]) ; ymax = double.Parse(sbuf[1]) ; dy = double.Parse(sbuf[2]) ; slogy = sbuf[3]; dat = sr.ReadLine();sbuf=dat.Split(delim);nd = int.Parse(sbuf[0]) - 1 ; md = int.Parse(sbuf[1]) - 1; //プロットデータ格納配列宣言 double[] datax =new double[nd+1]; //x値 double[,] datay =new double[md+1, nd+1]; //y値 int[] kind =new int[md+1]; //線種 string[] dname =new string[md+1]; //データ名(凡例名) string[] pltch =new string[md+1]; //プロット記号(TeX) for( k = 0 ;k<=md;k++){ dat = sr.ReadLine() ; sbuf = dat.Split(delim); kind[k] = int.Parse(sbuf[0]); pltch[k] = sbuf[1]; } dat = sr.ReadLine() ; sbuf = dat.Split(delim); for( k = 0 ;k<=md;k++){ dname[k] = sbuf[k + 1]; } i = 0; while(!sr.EndOfStream){ dat = sr.ReadLine();sbuf = dat.Split(delim); datax[i] = double.Parse(sbuf[0]); for( k = 0 ;k<=md;k++){ datay[k, i] = double.Parse(sbuf[k + 1]); } i = i + 1; } sr.Close(); nd = i - 1; //プロット領域定義 kxi = DHL; kxf = HSIZE - DHR; kyi = DVL; kyf = VSIZE - DVU; //対数値処理 if( slogx == "L"){ for( i = 0 ;i<=nd;i++){ if( datax[i] < Math.Pow(10.0, xmin))datax[i] = Math.Pow(10.0, xmin); datax[i] = Math.Log10(datax[i]); } } if( slogy == "L"){ for( k = 0 ;k<=md;k++){ for( i = 0 ;i<=nd;i++){ if( datay[k, i] < Math.Pow(10.0, ymin))datay[k, i] = Math.Pow(10.0, ymin); datay[k, i] = Math.Log10(datay[k, i]); } } } //TeXファイル書き込み saveFileDialog1.Filter = "*.tex|*.tex"; if(saveFileDialog1.ShowDialog()==DialogResult.OK)fnameW=saveFileDialog1.FileName; fnamedvi = fnameW; sw = new System.IO.StreamWriter(fnameW, false, System.Text.Encoding.Default); sw.WriteLine("\\documentclass[a4paper,10pt]{jsarticle}"); sw.WriteLine("\\input{jartfmt}"); sw.WriteLine("\\usepackage[dvipdfm]{graphics,graphicx}"); sw.WriteLine("\\begin{document}"); //sw.WriteLine("\\begin{center}"); sw.WriteLine("\\unitlength=1mm"); sw.WriteLine("\\begin{picture}(" + HSIZE.ToString("0.000") + "," + VSIZE.ToString("0.000") + ")"); //作図範囲枠 str0 = "(0,0)"; str1 = "(" + HSIZE.ToString("0.000") + ",0)"; str2 = "(" + HSIZE.ToString("0.000") + "," + VSIZE.ToString("0.000") + ")"; str3 = "(0," + VSIZE.ToString("0.000") + ")"; str4 = "(0,0)"; sw.WriteLine("\\path" + str0 + str1 + str2 + str3 + str4 + "%全体描画枠"); //x−y軸描画 if( slogx == "N") TeX_DRN_XJIKU(sw, xmin, xmax, dx, kxi, kxf, kyi, kyf); if( slogy == "N") TeX_DRN_YJIKU(sw, ymin, ymax, dy, kxi, kxf, kyi, kyf); if( slogx == "L") TeX_DRL_XJIKU(sw, xmin, xmax, kxi, kxf, kyi, kyf); if( slogy == "L") TeX_DRL_YJIKU(sw, ymin, ymax, kxi, kxf, kyi, kyf); //枠線描画 str1 = kxi.ToString("0.000"); str2 = kyi.ToString("0.000"); str3 = kxf.ToString("0.000"); str4 = kyi.ToString("0.000"); sw.WriteLine("\\path(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"); str1 = kxf.ToString("0.000"); str2 = kyi.ToString("0.000"); str3 = kxf.ToString("0.000"); str4 = kyf.ToString("0.000"); sw.WriteLine("\\path(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"); str1 = kxf.ToString("0.000"); str2 = kyf.ToString("0.000"); str3 = kxi.ToString("0.000"); str4 = kyf.ToString("0.000"); sw.WriteLine("\\path(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"); str1 = kxi.ToString("0.000"); str2 = kyf.ToString("0.000"); str3 = kxi.ToString("0.000"); str4 = kyi.ToString("0.000"); sw.WriteLine("\\path(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"); //x軸名描画 str1 = (0.5 * (kxi + kxf)).ToString("0.000"); str2 = (kyi - 8.0).ToString("0.000"); sw.WriteLine("\\put(" + str1 + "," + str2 + "){\\makebox(0,0){" + sxjiku + "}}"); //y軸名描画 str1 = (kxi - 15.0).ToString("0.000"); str2 = (0.5 * (kyi + kyf)).ToString("0.000"); sw.WriteLine("\\put(" + str1 + "," + str2 + "){\\makebox(0,0){\\rotatebox{90}{" + syjiku + "}}}"); //データプロット for( k = 0 ;k<= md;k++){ switch(kind[k]){ case 0: //線のみ sw.WriteLine("\\path"); for( i = 0 ;i<= nd;i++){ xx = datax[i]; yy = datay[k, i]; kxx = kxi + (xx - xmin) * (kxf - kxi) / (xmax - xmin); kyy = kyi + (yy - ymin) * (kyf - kyi) / (ymax - ymin); str1 = kxx.ToString("0.000"); str2 = kyy.ToString("0.000"); sw.WriteLine("(" + str1 + "," + str2 + ")"); } break; case 1: //線+記号 str0 = pltch[k]; if( (str0 == "$\\circ$") || (str0 == "$\\bullet$")){ sw.WriteLine("\\normalsize"); }else{ sw.WriteLine("\\scriptsize"); } sw.WriteLine("\\begin{drawjoin}"); for( i = 0 ;i<= nd;i++){ xx = datax[i]; yy = datay[k, i]; kxx = kxi + (xx - xmin) * (kxf - kxi) / (xmax - xmin); kyy = kyi + (yy - ymin) * (kyf - kyi) / (ymax - ymin); str1 = kxx.ToString("0.000"); str2 = kyy.ToString("0.000"); sw.WriteLine("\\jput(" + str1 + "," + str2 + "){\\makebox(0,0){" + str0 + "}}"); } sw.WriteLine("\\end{drawjoin}"); break; case 2: //記号のみ str0 = pltch[k]; if( (str0 == "$\\circ$")||(str0 == "$\\bullet$")){ sw.WriteLine("\\normalsize"); }else{ sw.WriteLine("\\scriptsize"); } for( i = 0 ;i<=nd;i++){ xx = datax[i]; yy = datay[k, i]; kxx = kxi + (xx - xmin) * (kxf - kxi) / (xmax - xmin); kyy = kyi + (yy - ymin) * (kyf - kyi) / (ymax - ymin); str1 = kxx.ToString("0.000"); str2 = kyy.ToString("0.000"); sw.WriteLine("\\put(" + str1 + "," + str2 + "){\\makebox(0,0){" + str0 + "}}"); } break; } } double ds = 5; double dh = 4; if( 0 < md ){ sw.WriteLine("\\normalsize"); for( k = 0 ;k<=md;k++){ switch(kind[k]){ case 0: kxx1 = kxf + ds; kyy1 = kyf - dh * (double)(k + 1); kxx2 = kxx1 + ds; kyy2 = kyy1; str1 = kxx1.ToString("0.000"); str2 = kyy1.ToString("0.000"); str3 = kxx2.ToString("0.000"); str4 = kyy2.ToString("0.000"); sw.WriteLine("\\path(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"); kxx = kxx2 + ds; kyy = kyf - dh * (double)(k + 1) - dh / 4; str1 = kxx1.ToString("0.000"); str2 = kyy1.ToString("0.000"); str0 = dname[k]; sw.WriteLine("\\put(" + str1 + "," + str2 + "){" + str0 + "}"); break; default: kxx = kxf + ds; kyy = kyf - dh * (double)(k + 1); str0 = pltch[k]; str1 = kxx.ToString("0.000"); str2 = kyy.ToString("0.000"); sw.WriteLine("\\put(" + str1 + "," + str2 + "){\\makebox(0,0){" + str0 + "}}"); kxx = kxx + ds; kyy = kyf - dh * (double)(k + 1) - dh / 4; str1 = kxx.ToString("0.000"); str2 = kyy.ToString("0.000"); str0 = dname[k]; sw.WriteLine("\\put(" + str1 + "," + str2 + "){" + str0 + "}"); break; } } } sw.WriteLine("\\end{picture}"); //sw.WriteLine("\\end{center}"); sw.WriteLine("\\end{document}"); sw.Close(); } //---------------------------------------------------------------------------- private void TeX_DRN_XJIKU(System.IO.StreamWriter sw, double xmin, double xmax, double dx, double kxi, double kxf, double kyi, double kyf) { int i, ix; double xx, kxx, wv; string str0, str1, str2, str3, str4, dat1, dat2; //普通x軸描画 ix = (int)((xmax - xmin) / dx); for (i = 0; i <= ix; i++) { xx = xmin + (double)i * dx; kxx = kxi + (xx - xmin) * (kxf - kxi) / (xmax - xmin); wv = xmin + (double)i * dx; str0 = wv.ToString("0"); if ((int)(dx * 1000.0) % 10 != 0) { str0 = wv.ToString("0.000"); } if ((int)(dx * 1000.0) % 10 == 0 && (int)(dx * 100.0) % 10 != 0) { str0 = wv.ToString("0.00"); } if ((int)(dx * 1000.0) % 10 == 0 && (int)(dx * 100.0) % 10 == 0 && (int)(dx * 10.0) % 10 != 0) { str0 = wv.ToString("0.0"); } str1 = kxx.ToString("0.000"); str2 = kyi.ToString("0.000"); str3 = kxx.ToString("0.000"); str4 = kyf.ToString("0.000"); dat1 = "\\dottedline{1}(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"; str2 = (kyi - 3.0).ToString("0.000"); dat2 = "\\put(" + str1 + "," + str2 + "){\\makebox(0,0){" + str0 + "}}"; sw.WriteLine(dat1 + dat2); } } //--------------------------------------------------------------------------------- private void TeX_DRN_YJIKU(System.IO.StreamWriter sw, double ymin, double ymax, double dy, double kxi, double kxf, double kyi, double kyf) { int i, iy; double yy, kyy, wv; string str0, str1, str2, str3, str4, dat1, dat2; //普通y軸描画 iy = (int)((ymax - ymin) / dy); for (i = 0; i <= iy; i++) { yy = ymin + (double)i * dy; kyy = kyi + (yy - ymin) * (kyf - kyi) / (ymax - ymin); wv = ymin + (double)i * dy; str0 = wv.ToString("0"); if ((int)(dy * 1000.0) % 10 != 0) { str0 = wv.ToString("0.000"); } if ((int)(dy * 1000.0) % 10 == 0 && (int)(dy * 100.0) % 10 != 0) { str0 = wv.ToString("0.00"); } if ((int)(dy * 1000.0) % 10 == 0 && (int)(dy * 100.0) % 10 == 0 && (int)(dy * 10.0) % 10 != 0) { str0 = wv.ToString("0.0"); } str1 = kxi.ToString("0.000"); str2 = kyy.ToString("0.000"); str3 = kxf.ToString("0.000"); str4 = kyy.ToString("0.000"); dat1 = "\\dottedline{1}(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"; str1 = (kxi - 6.0).ToString("0.000"); dat2 = "\\put(" + str1 + "," + str2 + "){\\makebox(0,0){" + str0 + "}}"; sw.WriteLine(dat1 + dat2); } } //--------------------------------------------------------------------------------- private void TeX_DRL_XJIKU(System.IO.StreamWriter sw, double xmin, double xmax, double kxi, double kxf, double kyi, double kyf) { int i, j; double xx, kxx; string str0, str1, str2, str3, str4; string dat1, dat2; //対数x軸描画 for (i = (int)xmin; i <= (int)xmax - 1; i++) { for (j = 1; j <= 9; j++) { xx = Math.Log10((double)j * Math.Pow(10.0, (double)i)); kxx = kxi + (xx - xmin) * (kxf - kxi) / (xmax - xmin); str1 = kxx.ToString("0.000"); str2 = kyi.ToString("0.000"); str3 = kxx.ToString("0.000"); str4 = kyf.ToString("0.000"); dat1 = "\\dottedline{1}(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"; sw.WriteLine(dat1); } } for (i = (int)xmin; i <= (int)xmax; i++) { xx = (double)i; kxx = kxi + (xx - xmin) * (kxf - kxi) / (xmax - xmin); str0 = (System.Math.Pow(10.0, (double)i)).ToString(); str1 = kxx.ToString("0.000"); str2 = (kyi - 3.0).ToString("0.000"); dat2 = "\\put(" + str1 + "," + str2 + "){\\makebox(0,0){" + str0 + "}}"; sw.WriteLine(dat2); } } //--------------------------------------------------------------------------------- private void TeX_DRL_YJIKU(System.IO.StreamWriter sw, double ymin, double ymax, double kxi, double kxf, double kyi, double kyf) { int i, j; double yy, kyy; string str0, str1, str2, str3, str4; string dat1, dat2; //対数y軸描画 for (i = (int)ymin; i <= (int)ymax - 1; i++) { for (j = 1; j <= 9; j++) { yy = Math.Log10((double)j * Math.Pow(10.0, (double)i)); kyy = kyi + (yy - ymin) * (kyf - kyi) / (ymax - ymin); str1 = kxi.ToString("0.000"); str2 = kyy.ToString("0.000"); str3 = kxf.ToString("0.000"); str4 = kyy.ToString("0.000"); dat1 = "\\dottedline{1}(" + str1 + "," + str2 + ")(" + str3 + "," + str4 + ")"; sw.WriteLine(dat1); } } for (i = (int)ymin; i <= (int)ymax; i++) { yy = (double)i; kyy = kyi + (yy - ymin) * (kyf - kyi) / (ymax - ymin); str0 = (Math.Pow(10.0, (double)i)).ToString(); str1 = (kxi - 6.0).ToString("0.000"); str2 = kyy.ToString("0.000"); dat2 = "\\put(" + str1 + "," + str2 + "){\\makebox(0,0){" + str0 + "}}"; sw.WriteLine(dat2); } } //--------------------------------------------------------------------------------- } }