아래 한글 수식 관련 매크로 스크립트

애석하게도 워드프로세서인 한글 2007을 쓸 일이 많은데, 본인이 만든 매크로 스크립트를 써 둔다. 뭐 필요한 사람이 있을지는 의문이지만-_-

아래 스크립트는 수학 문제의 선택 보기 다섯 개를 자동으로 생성해주는 스크립트다. 숫자 하나만 쓰고 실행하면 그 숫자를 초항으로 하는 공차 1인 등차수열로 다섯 개의 보기를 생성한다. 숫자를 두 개 쓰면 첫 번째 숫자가 초항이고 두 번째 숫자가 공차인 등차수열이 된다. 숫자를 두 개 쓰고 뒤쪽에 수식과 %를 쓰면 그 등차수열을 %에 넣어준다. 입력이 네 개일 경우 세 번째 입력이 분자, 네 번째 입력이 분모인 분수를 만들어주는데, 자동 약분을 해 준다.

function OnScriptMacro_숫자넣기()
{

	HAction.Run("MoveSelLineBegin");
	var text = GetTextFile("TEXT", "saveblock");
	HAction.Run("Delete");

	text=text.replace(/^1\. /,'');
	text=text.replace(/[\r|\n]/g,'');			//개행문자 제거

	var strArray = text.split(' ');
	var circleNumber= ["① ","\t② ","\t③ ","\t④ ","\t⑤ "];


	strArray[0]*= 1;			//문자형에서 정수형으로 변수 타입 변화

	if(strArray.length == 1)	//입력이 하나인 경우
	{
		strArray[1]=1;
	} else					//입력이 둘 이상인 경우
	{
		strArray[1]*= 1;
	}

	if(strArray.length < 3)	//입력이 둘 이하인 경우 초기화
	{
		strArray[2]="%";
	} else
	{
		strArray[2]=strArray[2].replace(/\./g,' ');			//쩜을 공백으로
		strArray[2]=kor_eng(strArray[2]);
	}

	if(strArray.length < 4)	//입력이 셋 이하일 경우 처리
	{
		strArray[3] = "1";
	} else
	{
		strArray[3]=strArray[3].replace(/\./g,' ');			//쩜을 공백으로
		strArray[3]=kor_eng(strArray[3]);
	}


var i, gcd, numerator, denominator, pi_on_numerator = "", sqrt_val = ["",""], square_part;			//numerator는 분자, denominator은 분모
for(i=0;i<5;i++)
{
	HAction.GetDefault("InsertText", HParameterSet.HInsertText.HSet);
	HParameterSet.HInsertText.Text = circleNumber[i];
	HAction.Execute("InsertText", HParameterSet.HInsertText.HSet);

	HAction.GetDefault("EquationCreate", HParameterSet.HEqEdit.HSet);
	with (HParameterSet.HEqEdit)
	{
		numerator = strArray[2].replace('%',strArray[0]+strArray[1]*i);
		denominator = strArray[3].replace('%',strArray[0]+strArray[1]*i);

//원주율 처리 시작
		if (numerator.indexOf('pi') != -1)
		{
			pi_on_numerator = "pi";
			numerator=numerator.replace('pi','');
		}
//원주율 처리 끝

//제곱근 처리 시작
		if (numerator.indexOf('sqrt') != -1)			//분자에 제곱근이 있을 경우
		{
			sqrt_val = numerator.split('sqrt');		//제곱근 앞과 안의 숫자를 분리함
			if (sqrt_val[1].search(/[^0-9|^\-|\s]/) == -1)			//만약 sqrt 뒤쪽이 숫자, 부호, 공백만이라면
			{
				sqrt_val[1]*= 1;                                 //문자에서 숫자로 변수 타입변환
				if (sqrt_val[1] != 0)                           //영으로 나누기 방지
				{
					square_part = finding_square_factor(sqrt_val[1]);
					sqrt_val[1] = (sqrt_val[1]/(square_part*square_part)).toString();
				}

				if (sqrt_val[0].search(/[^0-9|^\-|\s]/) == -1 && sqrt_val[0] != "")		//만약 sqrt 앞쪽이 숫자, 부호, 공백이라면
				{
					sqrt_val[0]*= 1;
					numerator = (sqrt_val[0]*square_part).toString();		//문자열 변수 타입변환
				} else
				{
					numerator = "" + sqrt_val[0] + square_part ;			//문자열 병합
				}
			} else
			{
				numerator = sqrt_val[0];
			}
		}
//제곱근 처리 끝

//약분 시작
		if (numerator.search(/[^0-9|^\-|\s]/) == -1 && denominator.search(/[^0-9|^\-|\s]/) == -1)	//모두 숫자, 부호, 공백만인지 판정
		{
			numerator*= 1;						//문자에서 숫자로 변수 타입변환
			denominator*= 1;
//부호처리 시작
			if (numerator < 0)			//분자가 음수
			{
				numerator*= -1;
				String = "-";
			}
			if (denominator < 0)			//분모가 음수
			{
				denominator*= -1;
				if (String == "-")		//분모와 분자 둘 다 음수
				{
					String = "";
				}
				else
				{
					String = "-";
				}
			}
//부호처리 끝
			if (numerator != 0 && denominator != 0)			//영으로 나누기 방지
			{
				gcd = find_gcd(numerator, denominator);
				numerator = (numerator/gcd).toString();					//약분
				denominator = (denominator/gcd).toString();
			}
		}
//약분 끝

		if (numerator == "0" || sqrt_val[1] == "0")				//분자가 영인 경우
		{
			String = 0;
		} else
		{
			var numerator_string="";
			if (sqrt_val[1] != "1" && sqrt_val[1] != "" )
			{
				numerator_string = "sqrt{" + sqrt_val[1] + "}";
			}
				numerator_string = numerator_string + pi_on_numerator;
			if (numerator_string == "" || numerator != "1")     // 1 생략 처리
			{
				numerator_string = numerator + numerator_string;
			} 

			if (denominator =="1")			//분모가 1이면
			{											//분수로 만들지 않는다.
				String = String + numerator_string;
			} else
			{
				String = String + "{" + numerator_string + "}over{" + denominator + "}";
			}
		}
	}
	HAction.Execute("EquationCreate", HParameterSet.HEqEdit.HSet);
}
HAction.Run("BreakPara");
HAction.Run("BreakPara");
HAction.Run("BreakPara");
HAction.Run("StyleShortcut2");

}


function find_gcd(a, b)		//gcd 찾는 함수
{
	var remainder = a % b;

	while(remainder !=0)
	{
		a = b;
		b = remainder;
		remainder = a % b;		//euclidean algorithm
	}
	return b;
}


function finding_square_factor(a)
{
	var prime_table = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]
	var i = 0, factors = 1;

	while (i < prime_table.length-1)
	{
		if (a % (prime_table[i]*prime_table[i]) == 0)
		{
			a = a / (prime_table[i]*prime_table[i]);
			factors = factors * prime_table[i];
		} else
		{
			i++;
		}
	}
	return factors;
}


function kor_eng(text)
{
var k_list =['ㅁ','ㅠ','ㅊ','ㅇ','ㄷ','ㄹ','ㅎ','ㅗ','ㅑ','ㅓ','ㅏ','ㅣ','ㅡ','ㅜ','ㅐ','ㅔ','ㅂ','ㄱ','ㄴ','ㅅ','ㅕ','ㅍ','ㅈ','ㅌ','ㅛ','ㅋ'];
var e_list =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];

var k_list2 =['‘','’','툐','냐ㅜ','챈','ㅅ무','앳','솓','뮤','챡','먀','뷰','그','금','긏','긍','귿','글','긓','급','극','근','긑','긋','메','뮻','으'];
var e_list2 =['\'','\'','xy','sin','cos','tan','dot','the','ab','cir','ai','qb','rm ','rm A','rm C','rm D','rm E','rm F','rm G','rm Q','rm R','rm S','rm X','rm T','ap','abc','dm'];
	var i;

	for(i=0;i<k_list2.length;i++)	{
		text=text.replace(RegExp(k_list2[i], "g"), e_list2[i]);
	}

	for(i=0;i<26;i++)
	{
		text=text.replace(RegExp(k_list[i], "g"), e_list[i]);
	}

	return text;
}

예를 들어
4
라고 쓰고 실행하면
① 4 ② 5 ③ 6 ④ 7 ⑤ 8
이 자동으로 만들어진다.

4 8
이라고 쓰고 실행하면
① 4 ② 12 ③ 20 ④ 28 ⑤ 36
이 된다.

4 8 sqrt%
라고 쓰고 실행하면
① 2 ② 2\sqrt{3}2\sqrt{5}2\sqrt{7} ⑤ 6
이 된다.

16 1 ㄴㅂㄱㅅ%.ㅔㅑ 3
라고 쓰고 실행하면
\frac{4\pi}{3}\frac{\sqrt{17}\pi}{3}\sqrt{2}\pi\frac{\sqrt{19}\pi}{3}\frac{2\sqrt{5}\pi}{3}
이 된다.

 


2015.8.26
대충-_- 한글로 쓰고 실행하면 수식으로 바꾸는 스크립트

function OnScriptMacro_text_math()
{
	HAction.Run("MoveSelPrevWord");
	var text = GetTextFile("TEXT", "saveblock");
	HAction.Run("Delete");

	text=text.replace(/^1\. /,'');
	text=text.replace(/\./g,' ');			//쩜을 공백으로
	text=text.replace(/[\r|\n]/g,'');		//개행문자 제거
	text=kor_eng(text);

	if(text.search(/rm /)==0) {		//rm으로 시작하면 대문자화
		text=text.toUpperCase();
	}

	HAction.GetDefault("EquationCreate", HParameterSet.HEqEdit.HSet);
	with (HParameterSet.HEqEdit)
	{
		String = text;
	}
	HAction.Execute("EquationCreate", HParameterSet.HEqEdit.HSet);
}


function kor_eng(text)
{
var k_list =['ㅁ','ㅠ','ㅊ','ㅇ','ㄷ','ㄹ','ㅎ','ㅗ','ㅑ','ㅓ','ㅏ','ㅣ','ㅡ','ㅜ','ㅐ','ㅔ','ㅂ','ㄱ','ㄴ','ㅅ','ㅕ','ㅍ','ㅈ','ㅌ','ㅛ','ㅋ'];
var e_list =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];

var k_list2 =['‘','’','툐','냐ㅜ','챈','ㅅ무','앳','솓','뮤','챡','먀','뷰','그','금','긏','긍','귿','글','긓','급','극','근','긑','긋','메','뮻','으'];
var e_list2 =['\'','\'','xy','sin','cos','tan','dot','the','ab','cir','ai','qb','rm ','rm A','rm C','rm D','rm E','rm F','rm G','rm Q','rm R','rm S','rm X','rm T','ap','abc','dm'];
	var i;

	for(i=0;i<k_list2.length;i++)
	{
		text=text.replace(RegExp(k_list2[i], "g"), e_list2[i]);
	}

	for(i=0;i<26;i++)
	{
		text=text.replace(RegExp(k_list[i], "g"), e_list[i]);
	}

	return text;
}

예를 들어 ㅌ=3 이라고 쓰고 실행하면 x=3이라는 수식으로 바꿔준다. 쩜이 수식입력기 내에서 띄어쓰기 역할을 한다. 예를 들어 ㄴㅂㄳ.ㅌ=3 이라고 입력하면 \sqrt{x}=3가 된다. 스크립트 실행 단축키를 alt+` 같은 걸로 설정하면 편리하다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중