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 vcsGRLN_TeX { public partial class Form1 : Form { 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; string str0, str1, str2, str3, str4; double kxx, kyy; //入出力用変数宣言 System.IO.StreamReader sr; System.IO.StreamWriter sw; string dat; string[] sbuf; char delim=','; string fname1=""; string fname2=""; int nd; //データ組数−1 int i; //データ読み込み openFileDialog1.InitialDirectory = System.IO.Directory.GetCurrentDirectory(); if (openFileDialog1.ShowDialog() == DialogResult.OK) { fname1 = openFileDialog1.FileName; } sr = new System.IO.StreamReader(fname1, 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; //プロットデータ格納配列宣言 double[] datax = new double[nd + 1]; double[] datay = new double[nd + 1]; for (i = 0; i <= nd; i++){ dat = sr.ReadLine(); sbuf = dat.Split(delim); datax[i] = double.Parse(sbuf[0]); datay[i] = double.Parse(sbuf[1]); } sr.Close(); //データ対数値処理 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 (i = 0; i <= nd; i++){ if (datay[i] < Math.Pow(10.0, ymin)) { datay[i] = Math.Pow(10.0, ymin); } datay[i] = Math.Log10(datay[i]); } } //プロット領域定義 kxi = DHL; kxf = HSIZE - DHR; kyi = DVL; kyf = VSIZE - DVU; //TeXファイル書き込み saveFileDialog1.Filter = "*.tex|*.tex"; if (saveFileDialog1.ShowDialog() == DialogResult.OK) {fname2 = saveFileDialog1.FileName; } fnamedvi = fname2; sw = new System.IO.StreamWriter(fname2, 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") + ")"); //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 + "}}}"); //データプロット str0 = "\\plotchar"; sw.WriteLine("\\newcommand{\\plotchar}{\\makebox(0,0){$\\bullet$}}"); sw.WriteLine("\\begin{drawjoin}"); for (i = 0; i <= nd; i++) { xx = datax[i]; yy = datay[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 + "){" + str0 + "}"); } sw.WriteLine("\\end{drawjoin}"); 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); } } //--------------------------------------------------------------------------------- } }